【问题标题】:What in the implementation needs to change in order for a left associative operator to become right associative?为了使左关联运算符变为右关联运算符,实现中需要更改哪些内容?
【发布时间】:2018-02-10 13:17:29
【问题描述】:

我正在阅读 Haskell,正如预期的那样,有些运算符是左结合的,而另一些是右结合的。这让我想到,在比较左关联版本和右关联版本时,新运算符 ¤ 的实现会有什么不同?

所以给定[1,2] ¤ [3,4] ¤ [5,6],如果我希望将其解释为(([1,2] ¤ [3,4]) ¤ [5,6])([1,2] ¤ ([3,4] ¤ [5,6])),实现会有哪些变化?

【问题讨论】:

    标签: haskell associative associativity


    【解决方案1】:

    要说明运算符是左关联还是右关联,可以使用fixity declaration

    例如

    infixl 5 .+.                  -- left associative
    infixr 5 .-.                  -- right associative
    infix  5 .=.                  -- not associative
    

    最后一个导致x .=. y .=. z 成为解析错误,需要显式括号。

    上面的数字5是优先级,应该在其他运算符的级别之后选择(例如(+)是6级,而($)是0级)。

    【讨论】:

    • 同样值得注意 - 默认固定性是infixl 9,其中 9 是提供给中缀运算符的最高优先级,0 是最低的。此外,您可以通过将名称放在反引号中来指定使用中缀的普通函数的固定性,就像实际使用中缀时一样。
    • 据我了解,您的.+..-..=. 代表您的示例中的运算符。点是运算符的一部分还是固定语法的一部分?
    • @PatrikIselind 它们是运营商名称的一部分。 infixl 5 %*+ 也可以,对于操作员 %*+
    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2015-09-27
    相关资源
    最近更新 更多