rem*_*rem 11 haskell ghc strictness
从GHC用户指南,好像最Pat
可能PBangPat
,但也有一些例外.例如,模块中的顶级刘海(例如!main
)是不允许的,并且 x : !xs
无法解析x : (!xs) parses
感谢@chi.关于可以添加刘海的正式规范是什么?我查看了用户指南和报告的一些章节但没有发现任何内容.
BangPatterns没有公认的正式规范,因为它们不是任何Haskell报告的一部分.我们对规范最接近的是用户指南以及它链接到的haskell-prime提案.
这两个来源都明确提到模块的顶层不允许爆炸模式.
至于x : !xs
,用户指南有关于爆炸模式的语法的说法:
我们在模式的语法中添加了一个新的生产:
Run Code Online (Sandbox Code Playgroud)pat ::= !pat
它应与Haskell 2010报告一起阅读:
Run Code Online (Sandbox Code Playgroud)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)
为运算符的一部分!
.例如,(! Just x)
被接受为模式,但(! ! x)
不是.