Где могут появиться 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)
не является.