2015-07-11 78 views
2

通過運營商的關聯性和優先級的樣子,我發現:離奇的優先級和結合

infixr 0 $ 
infixl 1 & 
infixl 4 <$> 
infixl 1 <&> 

這似乎離奇。 &<&>具有相同的優先級,但$<$>不僅具有廣泛不同的優先級,而且還在不同的方向關聯。

有沒有什麼好的理由,或者這只是一個歷史性的疣?如果這是一個歷史性的疣,你將如何去改變它?

回答

7

我假設您所說的<&>是來自鏡頭包。在這種情況下,鏡頭操作員的設置真的與其他鏡頭操作員相處得很好,他們並不太在乎常規操作員,因此<&>&可能是巧合。另外兩個,但是,更深思熟慮。

$根據定義是最低優先級。這就是它存在的原因。如此劇烈地改變文本的順序,以至於可以減少對括號的需要。因此它自然設置爲0.同時,<$>是上下文中的應用程序,您實際需要執行的操作,而$只是語法幫助。因此<$>比其他運營商更喜歡優先級,例如Alternative類運算符<|>的優先級較低,因此這些調用可以適當地與<$>鏈接。

至於關聯性,這只是運營商如何使用。 $通常用於更簡單的功能組成。有人可能會寫f $ g $ x來表示f (g x)。而<$>幾乎總是與<*>鏈接,這也是infixl 4。這樣,以下語句是有效的。

(+) <$> [1, 2, 3] <*> [10, 20, 30] 

由於左結合性,該表達式將被解析爲以下內容。

((+) <$> [1, 2, 3]) <*> [10, 20, 30] 

這正是我們想要的。函數(+)是curried的並接受兩個參數,這些參數應該一個接一個地傳遞。有了正確的結合性,會發生以下情況。

(+) <$> ([1, 2, 3] <*> [10, 20, 30]) 

這是說在第一個列表應用所有的數字到數字的第二個列表,然後將結果添加到...的東西。毋庸置疑,這不會受到損害。