2011-11-15 169 views
23

f x y = x * y。我們可以通過兩種方式應用此功能:f 5 6或使用中綴表示法,5 `f` 6。操作員規則是否適用於最後一個表達式?這個應用程序有什麼優先權?它只是函數應用的另一種形式,它也會具有最高的優先級嗎?Haskell中綴函數應用優先級

我想編譯器會看到這種特殊的形式(由於``和/或名稱以字母(?)開頭),並且實際上將其視爲普通函數應用程序,而不是將其視爲運算符。

+2

Haskell的98語法允許您選擇優先等級,有關詳細信息,請參閱http://www.haskell.org/onlinereport/decls.html#fixity。 –

+0

感謝Atal S-Z進行編輯! – demi

回答

22

Haskell 98 Report的具有清除它上Operator Applications一個部分:

操作者或者是一個運算符,如+或$$,或者是封閉在重音符的 普通標識符(反引號) ,如 `op`。例如,不用編寫前綴應用程序op x y, ,可以編寫中綴應用程序x`op` y。如果沒有針對`op`給出固定聲明 ,則默認爲最高優先級並且保留 關聯性(參見第4.4.2節)。

正如其他的答案指出,該報告還對Fixity Declarations一個部分,它允許你定義自己的固定性,例如:

infixl 7 `op` 
9

如果沒有給出明確的固定性聲明,例如,

infixl 7 `quot` 

一個backticked綴函數的infixl 9默認的固定性,所以會喜歡用相同的固定性任何其他綴運算符來處理。

+0

爲什麼它默認爲infixl 9?這個選擇背後有什麼理由,還是它是武斷的? – CMCDragonkai

+1

從某種意義上說,這當然是任意的。但是由於使用'infix'不允許沒有括號鏈接,所以有一個關聯方向會更方便。右關聯是罕見的,所以'infixl'是「最不令人驚訝」的選擇。 9的優先級最接近前綴應用優先級,因此與前綴應用相比,該優先級變化最小。在決定時,我不在那裏,但我認爲這個想法是,'infixl 9'被選中時期望它是最方便的,並且導致最少的驚喜。 –

+0

我明白了,但是'!!'和'$'之類的東西呢。有沒有任何理由爲什麼'!!'具有比$'更高的優先級?試圖理解表中操作符的所有位置的推理:https://www.haskell.org/onlinereport/decls.html#fixity – CMCDragonkai