Объятия !! Частичная ошибка приложения - PullRequest
6 голосов
/ 26 марта 2012

Объятия, похоже, имеют проблемы с несколькими нефиксированными !! в частичном приложении.

Хотя в GHCi это нормально работает:

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

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

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

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

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

или

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

1 Ответ

2 голосов
/ 30 марта 2012

Это известная проблема в 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+).

...