2017-04-15 32 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

相关问题