16
我剛剛注意到(<$>)
有一個固定的infixl 4
。怎麼會這樣?
(+1) <$> (/5) <$> [5,10]
顯然是從右到左。
我剛剛注意到(<$>)
有一個固定的infixl 4
。怎麼會這樣?
(+1) <$> (/5) <$> [5,10]
顯然是從右到左。
不,<$>
是左聯合的,這在你的例子中沒有什麼不同。 (+1) <$> (/5) <$> [5,10]
被讀作((+1) <$> (/5)) <$> [5,10]
。由於的Functor
實例基本上等同於函數組成,所以這恰好工作; fmap (+1) (/5)
相當於\x -> (x/5)+1
,在這種情況下,您可以得到與您看起來認爲可以使用的訂單相同的結果,即(+1) <$> ((+5) <$> [5,10])
。
因爲這有點令人困惑,所以如果您想在一行中應用多個函數,那麼在這裏使用正常函數組合運算符的可讀性可能更好:(+1) . (/5) <$> [5,10]
。
因此,就語義而言(和函子實際上滿足函子法則),它是左或右關聯並不重要。我想知道左邊的聯繫是否是故意的選擇,例如出於性能原因。它甚至可能是在理論上偶然或錯誤地以這種方式定義的。 – chi
@chi如果'(<$>)'是正確的聯想,你不能再使用'f <$> x <*> y'樣式模式(因爲'(<*>)'也必須是正確的聯想,因爲你可以一起使用它們像那樣的括號)。有些人說'($)'應該是聯合的,因爲那樣你就可以做'f $ gx $ hy'之類的東西,它就等於'f(gx)(hy)'和I猜測它與' - >'是正確的聯合關係是對稱的)。當然,它確實歸結爲偏好。 –
@DavidYoung啊,對。這很有道理,謝謝。 – chi