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

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

Ответ 1

Официальные спецификации для BangPattern не принимаются, поскольку они не являются частью какого-либо отчета 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) нет.