Как правильно использовать ассоциативные выражения в выражении?
Я определил свой собственный оператор:
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 ответ
Это не то, как работает ассоциативность.
Ассоциативность определяет поведение цепной операции с одним и тем же оператором.
Например, когда оператор * остается ассоциативным, то 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 вы также можете определять неассоциативные операторы. Это означает, что операции не могут быть связаны, иначе ваш компилятор вызовет ошибку разбора.