2017-04-15 34 views
16

我剛剛注意到(<$>)有一個固定的infixl 4。怎麼會這樣?

(+1) <$> (/5) <$> [5,10]顯然是從右到左。

回答

18

不,<$>是左聯合的,這在你的例子中沒有什麼不同。 (+1) <$> (/5) <$> [5,10]被讀作((+1) <$> (/5)) <$> [5,10]。由於的Functor實例基本上等同於函數組成,所以這恰好工作; fmap (+1) (/5)相當於\x -> (x/5)+1,在這種情況下,您可以得到與您看起來認爲可以使用的訂單相同的結果,即(+1) <$> ((+5) <$> [5,10])

因爲這有點令人困惑,所以如果您想在一行中應用多個函數,那麼在這裏使用正常函數組合運算符的可讀性可能更好:(+1) . (/5) <$> [5,10]

+0

因此,就語義而言(和函子實際上滿足函子法則),它是左或右關聯並不重要。我想知道左邊的聯繫是否是故意的選擇,例如出於性能原因。它甚至可能是在理論上偶然或錯誤地以這種方式定義的。 – chi

+2

@chi如果'(<$>)'是正確的聯想,你不能再使用'f <$> x <*> y'樣式模式(因爲'(<*>)'也必須是正確的聯想,因爲你可以一起使用它們像那樣的括號)。有些人說'($)'應該是聯合的,因爲那樣你就可以做'f $ gx $ hy'之類的東西,它就等於'f(gx)(hy)'和I猜測它與' - >'是正確的聯合關係是對稱的)。當然,它確實歸結爲偏好。 –

+0

@DavidYoung啊,對。這很有道理,謝謝。 – chi

相關問題