从GHC 用户指南看来,大多数Pat
都可以PBangPat
,但也有一些例外。例如,模块中的顶级刘海(如!main
)是不允许的,并且 x : !xs
无法解析x : (!xs) parses
感谢@chi。关于可以在哪里添加刘海的正式规范是什么?我查看了用户指南和报告的一些章节,但一无所获。
1 回答
6
BangPatterns 没有公认的正式规范,因为它们不是任何 Haskell 报告的一部分。我们拥有的最接近规范的是用户指南以及它链接到的 haskell-prime 提案。
这两个来源都明确提到在模块的顶层不允许使用 bang 模式。
至于x : !xs
,用户指南对 bang 模式的语法有这样的说法:
我们在模式的语法中添加了一个新的产生式:
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
是 a pat
,所以整个事情都是lpat qconop pat
)。因此,在这一点上,要么用户指南(和 haskell-prime 提案)是错误的,要么 GHC 是错误的。
我相信实际上 GHC 接受的语法是“任何看起来像有效表达式的东西”,包括解释(!x)
为 operator 的一部分!
。例如(! Just x)
被接受为模式但(! ! x)
不是。
于 2015-08-03T16:30:58.887 回答