0

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

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

我该如何解决?

4

1 回答 1

1

那不是关联性的工作方式。

关联性定义了具有相同运算符的链接操作的行为。

例如,当运算符 * 保持关联时,则a * b * c * d计算为((a * b) * c) * d

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

总之,你>+什么都不做,因为加法是可交换的。即,a + b + c等价于a >+ b >+ csince (a + b) + c = a + (b + c)

在 Haskell 中,您还可以定义非关联运算符。这意味着这些操作不能被链接,否则您的编译器将引发解析错误。

于 2016-02-24T23:42:39.320 回答