2016-02-24 3 views
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 

Как я могу это исправить?

+1

Ни один из предоставленных вами кодов не содержит ничего о правильной ассоциативности. Правильная ассоциативность только делает что-то, когда вы используете функцию infix. Функция-приложение _always_ имеет самый высокий приоритет. –

+0

@LouisWasserman Теперь я понимаю, откуда возникла путаница OP! – Jubobs

+3

Я думаю, что OP ожидает '(> + 5)' применять к '10' перед' (\ 'mod \' 14) ', но это никогда не произойдет, в основном. –

ответ

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

Смежные вопросы