Где могут появиться BangPatterns

Из руководства пользователя GHC кажется, что большинство Pat может быть PBangPat, но есть несколько исключений. например, челки верхнего уровня в модуле (например, !main) не допускаются и x : !xs не может разобрать x : (!xs) parses спасибо @chi. Какова официальная спецификация о том, где можно добавить челки? Я просмотрел несколько глав руководства пользователя и отчета, но ничего не нашел.

1 ответ

Решение

Не существует общепринятой формальной спецификации для BangPatterns, поскольку они не являются частью какого-либо отчета Haskell. Самое близкое, что у нас есть к спецификации, - это Руководство пользователя вместе с предложением haskell-prime, на которое оно ссылается.

В обоих этих источниках прямо упоминается, что шаблон взрыва не допускается на верхнем уровне модуля.

Что касается x : !xsВ Руководстве пользователя сказано следующее о синтаксисе шаблонов взрыва:

Мы добавляем один новый продукт в синтаксис шаблонов:

pat  ::= !pat

Это следует читать вместе с докладом на Haskell 2010:

pat  ::= lpat qconop pat
       | lpat

lpat ::= apat
       | - (integer | float)
       | gcon apat_1 ... apat_k

apat ::= var [ @ apat]
       | ...
       | ( pat )
       | ...

Согласно этим правилам x : !xs на самом деле надо разобрать (т.к. !xs это patвсе дело в том lpat qconop pat). Таким образом, либо Руководство пользователя (и предложение haskell-prime) неверно, либо GHC ошибается в этом вопросе.

Я считаю, что на практике синтаксис, принятый GHC, - это "все, что выглядит как правильное выражение", включая интерпретацию (!x) как раздел оператора !, Например (! Just x) принимается как образец, но (! ! x) не является.

Другие вопросы по тегам