【发布时间】:2017-04-15 14:41:22
【问题描述】:
我刚刚注意到(<$>) 的固定性为infixl 4。这怎么可能?
(+1) <$> (/5) <$> [5,10] 显然从右到左工作。
【问题讨论】:
标签: haskell associativity
我刚刚注意到(<$>) 的固定性为infixl 4。这怎么可能?
(+1) <$> (/5) <$> [5,10] 显然从右到左工作。
【问题讨论】:
标签: haskell associativity
不,<$> 保持关联,这在您的示例中没有什么不同。 (+1) <$> (/5) <$> [5,10] 读作((+1) <$> (/5)) <$> [5,10]。这恰好起作用,因为(->) a 的Functor 实例基本上等同于函数组合; fmap (+1) (/5) 等价于 \x -> (x/5)+1,在这种情况下,它给你的结果与你认为它工作的顺序相同,即(+1) <$> ((+5) <$> [5,10])。
因为这有点令人困惑,如果您想连续应用多个函数,在此处使用普通函数组合运算符可能会更好地提高可读性:(+1) . (/5) <$> [5,10]。
【讨论】:
(<$>) 是右结合的,你就不能再使用f <$> x <*> y 样式模式(因为(<*>) 也必须是右结合的,你可以在没有括号的情况下一起使用它们像那样)。有些人说 ($) 应该是关联的,因为那样你可以做类似 f $ g x $ h y 的事情,它相当于 f (g x) (h y) (我想它会与 -> 是对的联想)。当然,这实际上归结为偏好。