BangPatterns 可以出现在哪里
Where can BangPatterns appear
从 GHC user guide 看来大多数 Pat
可以是 PBangPat
,但也有一些例外。例如模块中的顶级刘海(如 !main
)是不允许的 并且 x : !xs
无法解析 x : (!xs) parses
感谢@chi。关于可以添加刘海的正式规范是什么?我查看了用户指南和报告的某些章节,但一无所获。
BangPatterns 没有公认的正式规范,因为它们不是任何 Haskell 报告的一部分。我们拥有的最接近规范的东西是用户指南以及它链接到的 haskell-prime 提案。
这两个来源都明确提到模块的顶层不允许使用 bang 模式。
至于 x : !xs
,用户指南对 bang 模式的语法是这样说的:
We add a single new production to the syntax of patterns:
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 接受的语法是 "anything that looks like a valid expression",包括将 (!x)
解释为运算符 !
的一部分。例如 (! Just x)
被接受为模式,但 (! ! x)
不是。
从 GHC user guide 看来大多数 Pat
可以是 PBangPat
,但也有一些例外。例如模块中的顶级刘海(如 !main
)是不允许的 并且 x : !xs
无法解析 x : (!xs) parses
感谢@chi。关于可以添加刘海的正式规范是什么?我查看了用户指南和报告的某些章节,但一无所获。
BangPatterns 没有公认的正式规范,因为它们不是任何 Haskell 报告的一部分。我们拥有的最接近规范的东西是用户指南以及它链接到的 haskell-prime 提案。
这两个来源都明确提到模块的顶层不允许使用 bang 模式。
至于 x : !xs
,用户指南对 bang 模式的语法是这样说的:
We add a single new production to the syntax of patterns:
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 接受的语法是 "anything that looks like a valid expression",包括将 (!x)
解释为运算符 !
的一部分。例如 (! Just x)
被接受为模式,但 (! ! x)
不是。