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