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

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

Пока это отлично работает в GHCi:

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

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

Является ли это ошибкой в ​​объятиях?

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

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

или

(([[0]]!!0)!!)0
1 ответ

Это известная проблема в Hugs. Из раздела Hugs 98 User Guide в разделе "Выражения":

В объятиях выражение должно быть 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 !!'
</interactive>

Потому что (!!) был установлен с infixr и теперь является право-ассоциативным. Если вы используете infixl, эта строка работает нормально.

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

licensed under cc by-sa 3.0 with attribution.