Как правильно использовать ассоциативные выражения в выражении?

Я определил свой собственный оператор:

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

Другие вопросы по тегам