Haskell语言报告:reservedid的定义

Haskell Language Report: definition of reservedid

好的,所以我花了一整天的时间研究 Haskell 语言报告 (2010),并找到了各种 "interesting" 边缘案例。您认为应该是错误的东西,但实际上是允许的。

特别是,请考虑词法语法参考(第 10.2 节)中的以下摘录:

reservedid → case | class | data | default | deriving | do | else
           | foreign | if | import | in | infix | infixl |
           | infixr | instance | let | module | newtype | of
           | then | type | where | _

可能 希望在该列表中看到 qualified ……但它不在那里。 (就此而言,ashiding 也不是。)

现在我想知道……这是报告中的一个意外疏忽吗?或者这是故意的设计决定?

看来 GHC 至少遵循规范的字母,因为它会很高兴地允许您定义一个名称实际上是 qualified 的变量。很奇怪,但确实如此。所以看起来这个名字在一种情况下只是 "special" 。相比之下,您可以从不 命名变量module。我们本可以只在文件的开头使这个词特殊……但我们没有。

qualifiedashiding只作为关键字出现在特定的地方,因此可以作为变量名。

  • qualified 只出现在 import.
  • 之后
  • as 只出现在 import qualified PACKAGE
  • 之后
  • hiding 只出现在 import [qualified] PACKAGE [as NAME]
  • 之后

当您指出 module 可能是这些特定于展示位置的关键字之一时,我明白您的意思了,但是命名任何内容 module 似乎违反直觉。也许 Haskell 的早期版本允许在一个文件中包含多个模块?

qualifiedhiding 也可以这样说,但我经常使用 as,例如:

zip [] _  = []
zip _  [] = []
zip (a:as) (b:bs) = (a, b) : zip as bs

因此,考虑到这一点,我认为这确实是一个设计决定,我认为很多语言*都可以包含在内。

可能值得指出 deriving 可能是这些词之一,因为它总是跟在数据声明之后,以及 foreign,因为它只保留在 FFI 扩展名中。


*尤其是javascript,它是huge list of mainly pointless reserved words!

首先,关键字"as"、"hiding"和"qualified"不在Haskell的原始定义中。添加它们时,为了向后兼容,它们并没有成为保留字。添加保留字是破解代码的可靠方法。这是一个非常深思熟虑的决定。

其次,据我所知Haskell不禁止每个文件有多个模块。该规范根本不讨论文件。 (但我不知道有任何实现允许它。)