我已经定义了自己的运算符:
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
我该如何解决?
答案 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中,您还可以定义非关联运算符。这意味着操作无法链接,或者编译器会引发解析错误。