通過運營商的關聯性和優先級的樣子,我發現:離奇的優先級和結合
infixr 0 $
infixl 1 &
infixl 4 <$>
infixl 1 <&>
這似乎離奇。 &
和<&>
具有相同的優先級,但$
和<$>
不僅具有廣泛不同的優先級,而且還在不同的方向關聯。
有沒有什麼好的理由,或者這只是一個歷史性的疣?如果這是一個歷史性的疣,你將如何去改變它?
通過運營商的關聯性和優先級的樣子,我發現:離奇的優先級和結合
infixr 0 $
infixl 1 &
infixl 4 <$>
infixl 1 <&>
這似乎離奇。 &
和<&>
具有相同的優先級,但$
和<$>
不僅具有廣泛不同的優先級,而且還在不同的方向關聯。
有沒有什麼好的理由,或者這只是一個歷史性的疣?如果這是一個歷史性的疣,你將如何去改變它?
我假設您所說的<&>
是來自鏡頭包。在這種情況下,鏡頭操作員的設置真的與其他鏡頭操作員相處得很好,他們並不太在乎常規操作員,因此<&>
和&
可能是巧合。另外兩個,但是,更深思熟慮。
$
根據定義是最低優先級。這就是它存在的原因。如此劇烈地改變文本的順序,以至於可以減少對括號的需要。因此它自然設置爲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])
這是說在第一個列表應用所有的數字到數字的第二個列表,然後將結果添加到...的東西。毋庸置疑,這不會受到損害。