【问题标题】:Where can BangPatterns appearBangPatterns 可以出现在哪里
【发布时间】:2015-10-25 17:44:36
【问题描述】:

GHC user guide 看来,大多数Pat 可以是PBangPat,但也有一些例外。例如不允许模块中的顶级刘海(如!main并且x : !xs 无法解析 x : (!xs) parses 感谢@chi。关于可以在哪里添加刘海的正式规范是什么?我查看了用户指南和报告的一些章节,但一无所获。

【问题讨论】:

  • 好问题,尽管有疑问,最好不要使用 BangPatterns,而是使用旧的 seq

标签: haskell ghc strictness


【解决方案1】:

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实际上应该解析(因为!xspat,所以整个事情是lpat qconop pat)。因此,在这一点上,要么用户指南(和 haskell-prime 提案)是错误的,要么 GHC 是错误的。

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

【讨论】:

猜你喜欢
  • 2011-06-18
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 2020-05-02
  • 2018-05-15
  • 2011-07-01
相关资源
最近更新 更多