BangPatterns出现在哪里

时间:2015-08-03 14:46:41

标签: haskell ghc strictness

GHC user guide起,似乎大多数Pat可以是PBangPat,但也有一些例外情况。例如模块中的顶级刘海(如!main)不允许x : !xs无法解析 x : (!xs) parses感谢@chi。关于可以添加刘海的正式规范是什么?我查看了用户指南和报告的一些章节但没有发现任何内容。

1 个答案:

答案 0 :(得分:6)

BangPatterns没有公认的正式规范,因为它们不是任何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实际上应该解析(因为!xspat,整个事情是lpat qconop pat)。因此,用户指南(以及haskell-prime提案)是错误的,或者GHC在这一点上是错误的。

我相信在实践中,GHC接受的语法是"看起来像有效表达的任何东西"包括将(!x)解释为运算符!的一部分。例如,(! Just x)被接受为模式,但(! ! x)不是。