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