【问题标题】:Haskell Language Report: definition of reservedidHaskell 语言报告:reservedid 的定义
【发布时间】:2015-04-11 16:25:00
【问题描述】:

好的,所以我整天都在研究 Haskell 语言报告 (2010),并找到了各种“有趣”的边缘案例。您认为应该是错误的东西,但实际上是允许的。

请特别考虑以下词汇语法参考(第 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。很奇怪,但确实如此。所以看起来这个名字只是在一种情况下是“特殊的”。相比之下,您可以永远将变量命名为module。我们可以只在文件的开头使这个词变得特别……但我们没有。

【问题讨论】:

  • 有趣的是,StackOverflow 似乎不认为 foreign 是关键字...(请注意,我不知道它自动检测到哪种语言,所以...)

标签: haskell syntax


【解决方案1】:

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

【讨论】:

  • 我经常发现自己尝试将ifof 用于in-file 和out-file。显然,那失败得很惨...... ;-)
  • 与其说它们只能出现在特定的地方,不如说没有普通标识符可以出现在相同的地方。 modulederivingforeign 都打破了这一点。
【解决方案2】:

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

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

【讨论】:

  • 最特别的是,asa 的复数形式。我敢肯定有人在某个地方使用过它。
猜你喜欢
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 2015-11-20
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
相关资源
最近更新 更多