我想知道爲什麼Haskell設計師同意只允許10級優先級?有人發現它不足嗎?爲什麼Haskell優先級只有10個級別?足夠的數字?
回答
據我所知,這完全是任意的。我所知道的所有文件只是將其作爲一個事實點,沒有任何闡述或理由。
但是,如果你仔細想想,爲什麼還會有其他更好的?好吧,假設10是不夠的。你有(.)
這是固定性最高的,你想要其他更緊密的東西。你增加一個額外的等級,所以你的新的最大值是10(即使大多數固定值只能達到9)。
現在你有11個優先級。 (這太荒謬了,它甚至不好笑,)這是不是比10更隨意?什麼是阻止你添加更多?如果你想在現有的水平之間有新的水平呢?當然,你可以繼續添加更多,直到最終你發現自己寫作infix↑ (ω + 2i)
並想知道你的生活出了什麼問題。
事情是,操作符優先級本質上是一個非常隨意的事情。有幾個約定 - 綁定比加法更緊密的乘法事物,邏輯運算符的優先級低於布爾值函數,比如(==)
- 但這些約束有限,通常不會超過幾個級別。否則,記住操作符優先級的唯一方法是......呃,記住它們,就像簡單地記住它們一樣。這不僅是一件苦差事,它可能使代碼不透明,而其他人可能沒有記住所有的東西。人類的工作記憶是非常有限的資源,所以編碼時需要回憶的挑剔細節越少越好。
大多數Haskell的運營商,其中優先事項分爲幾粗糙集團之一的用途:
Pseudosyntactic運營商如共同使用的
($)
,這通常需要非常高或低優先級,以避免與其他有衝突運營商。使用標準運算符或其變體的表達式,其中存在少數標準優先級級別,並且新運算符通常應共享與基於它們的任何級別相同的級別。
專門的操作員集,例如EDSL,其符號和優先級通常選擇爲反映EDSL的性質,並且不可能與其他操作員集合共存。
所有這些管理都很好,只有幾個優先級。更重要的是,它們的特點是要麼獨立於其他運營商,要麼只與其他運營商非常有限的一起使用。開始添加更多的操作符並將它們混合在單個表達式中,很快人們就會開始使用明確的括號,因爲他們不記得什麼綁定比什麼更緊密。對於我自己來說,在將EDSL樣式的操作符(如Arrow
組合器)與邏輯操作符混合在一起時,我已經傾向於顯式括號化,因爲我通常不會記得每個操作符具有的確切優先級。
所以,已經確定了:1)大量額外優先級的不會是有用的,因爲這太過分了跟蹤,並2)我們挑選任何限制將是同樣武斷。 ..爲什麼10?我會猜測「因爲固定值只有一位數」。
好的答案(特別是「想知道你的生活出了什麼問題」),但我認爲你至少應該在一個Spinal Tap參考中被黑客入侵。 – 2011-06-12 07:45:10
@mu太短:啊,那將是「大多數固定只能到9」。但是,大多數放大器都會達到10,因爲搖滾音樂家傾向於從1而不是0來計數。但是範圍相當。 (實際上,該段中的很多措詞都是模仿Spinal Tap的線條,但這更細微) – 2011-06-12 15:38:01
我想當一個人需要計算數字(加法,乘法,指數),關係運算符和邏輯運算符( &&,||)一個已經有六個級別(如果你想'a Ingo 2013-03-07 17:04:05
級別的數量是任意的,我記得這個決定是很多級別讓人難以記住操作員如何交互。例如Prolog允許有1000個關卡,但我從未發現它比Haskell好得多。
擴展Haskell的優先級可以想象變成一個有理數,這樣你總是可以在兩個現有的運算符之間適合一個運算符。但更好的選擇可能是切換到部分訂單的優先順序。因此,如果給兩個運營商,他們可以相關,然後相應處理,或無關,這將強制括號。
老實說,偏序似乎更接近我的實際想法。雖然我不確定如何處理像'($)'這樣的運算符,而您只希望它「比大多數/所有其他運算符都低」。簡單地說,具有獨特的最大/最小優先級似乎相當不靈活。 – 2011-06-12 16:00:15
@camccann我還沒有看到一個令人滿意的解決方案呢。所以我們堅持我們所擁有的,這比大多數語言還要好。 – augustss 2011-06-12 16:09:58
噢,我希望你也能想出那個部分。 :] 好吧。現在的方式似乎與功率/複雜度比率的局部最大值非常接近。 – 2011-06-12 16:18:21
- 1. 優先級和優先級
- 2. 這兩個優先級隊列包裝器有什麼區別?
- 3. Haskell中綴函數應用優先級
- 4. 具有兩個優先級的優先級隊列Python
- 5. 優先級隊列中的優先級
- 6. 在linux下,pthread優先級與lwp優先級有什麼關係?
- 7. Haskell中的運算符優先級
- 8. 操作的優先級在Haskell
- 9. 兩個類別之間的優先級
- 10. MLFQ的優先級是什麼?
- 11. JavaScript執行的優先級是什麼?
- 12. Haskell優先級:Lambda和運算符
- 13. Haskell類型運算符優先級
- 14. 具有動態項目優先級的優先級隊列
- 15. Spring事務隔離級別vs數據庫隔離級別的優先級
- 16. 爲什麼在Perl中沒有相當於//的低優先級?
- 17. 爲什麼Mercurial只有一個級別的回滾?
- 18. C++函數中非常奇怪的優先級/優先級
- 19. 優先級隊列的優先級總是需要是整數?
- 20. Linux內核中使用的三個優先級之間有什麼區別?
- 21. 優先上傳優先級,以高優先級使用HTB qdiscs
- 22. 優先級
- 23. 爲什麼最大優先級隊列沒有DECREASE KEY?
- 24. 「實際上」足夠的數據庫規範化級別是什麼?
- 25. 爲什麼域名空間樹只能有128個級別?
- 26. D上的優化級別是什麼?
- 27. 爲什麼此優先級隊列實現只重複打印一個值?
- 28. 爲什麼這個工作優先級=''-1在mysql中
- 29. 這個優先級隊列邏輯java有什麼問題?
- 30. MySQL的優先級
添加第11級會產生副作用O.o – 2011-06-12 05:58:46
因爲Nigel Tufnel不知道Haskell。 – 2011-06-12 06:00:08