Обнимашки!! Частичная ошибка приложения

У Hugs, похоже, есть проблема с несколькими незашифрованными !! в частичном приложении.

Хотя это отлично работает в GHCI:

([[0]]!!0!!)0

Hugs сообщает о синтаксической ошибке для файла ).

Это ошибка в Hugs?

Однако добавление дополнительной скобки для второго оператора индекса списка работает:

(([[0]]!!)0!!)0

or

(([[0]]!!0)!!)0

person fabb    schedule 26.03.2012    source источник
comment
Я не уверена. Я предполагаю, что это другая интерпретация стандартов Haskell. На самом деле это происходит с каждым разделом, где более одного оператора имеют самый низкий приоритет.   -  person fuz    schedule 26.03.2012


Ответы (1)


Это известная проблема в Hugs. Из раздела Руководства пользователя 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, эта строка работает нормально.

Это совершенно отдельная проблема от вопроса, который вы задали. Речь идет о левой и правой ассоциативности, тогда как проблема с Hugs заключается в том, что он просто не анализирует выражение, такое как (a+b+).

person Vlad the Impala    schedule 29.03.2012