Это известная проблема в Hugs. Из раздела Руководство пользователя *1001* Hugs 98 по выражениям:
В Hugs выражение должно быть fexp
(или case
или do
). Юридические выражения, такие как (a+b+)
и (a*b+)
, отклоняются.
Предупреждение об отклонении
Может быть, именно об этом FUZxxl
говорил в своем комментарии?
Попробуйте определить свою собственную функцию (!!)
в ghc
и установите для нее правильную ассоциативную фиксированность:
import Prelude hiding ((!!))
infixr 5 !! -- infixr will make it right associative
(!!) a b = head . drop b $ a
Теперь эта строка не будет работать и в ghci
!
ghci> :t ([[0]] !! 0 !!)
<interactive>:1:1:
The operator `!!' [infixr 5] of a section
must have lower precedence than that of the operand,
namely `!!' [infixr 5]
in the section: `[[0]] !! 0 !!'
Потому что (!!)
был установлен с infixr
и теперь является ассоциативным справа. Если вы используете infixl
, эта строка работает нормально.
Это совершенно отдельный вопрос от вопроса, который вы задали. Речь идет об ассоциативности слева направо, тогда как проблема с Хагсом заключается в том, что он просто не анализирует выражение типа (a+b+)
.