【问题标题】:How can (<$>) be left associative(<$>) 如何保持关联
【发布时间】:2017-04-15 14:41:22
【问题描述】:

我刚刚注意到(&lt;$&gt;) 的固定性为infixl 4。这怎么可能?

(+1) &lt;$&gt; (/5) &lt;$&gt; [5,10] 显然从右到左工作。

【问题讨论】:

    标签: haskell associativity


    【解决方案1】:

    不,&lt;$&gt; 保持关联,这在您的示例中没有什么不同。 (+1) &lt;$&gt; (/5) &lt;$&gt; [5,10] 读作((+1) &lt;$&gt; (/5)) &lt;$&gt; [5,10]。这恰好起作用,因为(-&gt;) aFunctor 实例基本上等同于函数组合; fmap (+1) (/5) 等价于 \x -&gt; (x/5)+1,在这种情况下,它给你的结果与你认为它工作的顺序相同,即(+1) &lt;$&gt; ((+5) &lt;$&gt; [5,10])

    因为这有点令人困惑,如果您想连续应用多个函数,在此处使用普通函数组合运算符可能会更好地提高可读性:(+1) . (/5) &lt;$&gt; [5,10]

    【讨论】:

    • 因此,就语义而言,它是左关联还是右关联并不重要(并且函子确实满足函子定律)。我想知道左联想是否是经过深思熟虑的选择,例如出于性能原因。理论上,它甚至可能是偶然或错误地以这种方式定义的。
    • @chi 如果(&lt;$&gt;) 是右结合的,你就不能再使用f &lt;$&gt; x &lt;*&gt; y 样式模式(因为(&lt;*&gt;) 也必须是右结合的,你可以在没有括号的情况下一起使用它们像那样)。有些人说 ($) 应该是关联的,因为那样你可以做类似 f $ g x $ h y 的事情,它相当于 f (g x) (h y) (我想它会与 -&gt; 是对的联想)。当然,这实际上归结为偏好。
    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 2017-06-22
    相关资源
    最近更新 更多