2011-06-12 25 views

回答

20

據我所知,這完全是任意的。我所知道的所有文件只是將其作爲一個事實點,沒有任何闡述或理由。

但是,如果你仔細想想,爲什麼還會有其他更好的?好吧,假設10是不夠的。你有(.)這是固定性最高的,你想要其他更緊密的東西。你增加一個額外的等級,所以你的新的最大值是10(即使大多數固定值只能達到9)。

現在你有11個優先級。 (這太荒謬了,它甚至不好笑,)這是不是比10更隨意?什麼是阻止你添加更多?如果你想在現有的水平之間有新的水平呢?當然,你可以繼續添加更多,直到最終你發現自己寫作infix↑ (ω + 2i)並想知道你的生活出了什麼問題。

事情是,操作符優先級本質上是一個非常隨意的事情。有幾個約定 - 綁定比加法更緊密的乘法事物,邏輯運算符的優先級低於布爾值函數,比如(==) - 但這些約束有限,通常不會超過幾個級別。否則,記住操作符優先級的唯一方法是......呃,記住它們,就像簡單地記住它們一樣。這不僅是一件苦差事,它可能使代碼不透明,而其他人可能沒有記住所有的東西。人類的工作記憶是非常有限的資源,所以編碼時需要回憶的挑剔細節越少越好。

大多數Haskell的運營商,其中優先事項分爲幾粗糙集團之一的用途:

  • Pseudosyntactic運營商如共同使用的($),這通常需要非常高或低優先級,以避免與其他有衝突運營商。

  • 使用標準運算符或其變體的表達式,其中存在少數標準優先級級別,並且新運算符通常應共享與基於它們的任何級別相同的級別。

  • 專門的操作員集,例如EDSL,其符號和優先級通常選擇爲反映EDSL的性質,並且不可能與其他操作員集合共存。

所有這些管理都很好,只有幾個優先級。更重要的是,它們的特點是要麼獨立於其他運營商,要麼只與其他運營商非常有限的一起使用。開始添加更多的操作符並將它們混合在單個表達式中,很快人們就會開始使用明確的括號,因爲他們不記得什麼綁定比什麼更緊密。對於我自己來說,在將EDSL樣式的操作符(如Arrow組合器)與邏輯操作符混合在一起時,我已經傾向於顯式括號化,因爲我通常不會記得每個操作符具有的確切優先級。

所以,已經確定了:1)大量額外優先級的不會是有用的,因爲這太過分了跟蹤,並2)我們挑選任何限制將是同樣武斷。 ..爲什麼10?我會猜測「因爲固定值只有一位數」。

+3

好的答案(特別是「想知道你的生活出了什麼問題」),但我認爲你至少應該在一個Spinal Tap參考中被黑客入侵。 – 2011-06-12 07:45:10

+2

@mu太短:啊,那將是「大多數固定只能到9」。但是,大多數放大器都會達到10,因爲搖滾音樂家傾向於從1而不是0來計數。但是範圍相當。 (實際上,該段中的很多措詞都是模仿Spinal Tap的線條,但這更細微) – 2011-06-12 15:38:01

+0

我想當一個人需要計算數字(加法,乘法,指數),關係運算符和邏輯運算符( &&,||)一個已經有六個級別(如果你想'a Ingo 2013-03-07 17:04:05

7

級別的數量是任意的,我記得這個決定是很多級別讓人難以記住操作員如何交互。例如Prolog允許有1000個關卡,但我從未發現它比Haskell好得多。

擴展Haskell的優先級可以想象變成一個有理數,這樣你總是可以在兩個現有的運算符之間適合一個運算符。但更好的選擇可能是切換到部分訂單的優先順序。因此,如果給兩個運營商,他們可以相關,然後相應處理,或無關,這將強制括號。

+0

老實說,偏序似乎更接近我的實際想法。雖然我不確定如何處理像'($)'這樣的運算符,而您只希望它「比大多數/所有其他運算符都低」。簡單地說,具有獨特的最大/最小優先級似乎相當不靈活。 – 2011-06-12 16:00:15

+1

@camccann我還沒有看到一個令人滿意的解決方案呢。所以我們堅持我們所擁有的,這比大多數語言還要好。 – augustss 2011-06-12 16:09:58

+0

噢,我希望你也能想出那個部分。 :] 好吧。現在的方式似乎與功率/複雜度比率的局部最大值非常接近。 – 2011-06-12 16:18:21