如何在表达式中使用右关联op?

时间:2016-02-24 22:49:07

标签: haskell operators associativity

我已经定义了自己的运算符:

infixr 6 >+
x >+ y = (+ x) y

这是正确的联想。

现在我想在下一个表达式中使用:

(`mod` 14) (>+ 5) 10

但是我收到了一个错误:

<interactive>:11:1:
    Non type-variable argument in the constraint: Integral (a -> a)
    (Use FlexibleContexts to permit this)
    When checking that ‘it’ has the inferred type
      it :: forall a. (Integral (a -> a), Num a) => a

我该如何解决?

1 个答案:

答案 0 :(得分:1)

不是关联性如何发挥作用。

Associativity定义了具有相同运算符的链式操作的行为。

例如,当运算符*保持关联状态时,a * b * c * d将被评估为((a * b) * c) * d

如果*是右关联的,那么它将被评估为a * (b * (c * d))

总之,你的>+没有做任何事情,因为加法是可交换的。也就是说,a + b + c相当于a >+ b >+ c以来的(a + b) + c = a + (b + c)

在Haskell中,您还可以定义非关联运算符。这意味着操作无法链接,或者编译器会引发解析错误。