Haskell语言报告:reservedid的定义

Mat*_*hid 6 syntax haskell

好的,所以我花了一整天时间玩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 | _
Run Code Online (Sandbox Code Playgroud)

可能希望qualified在该列表中看到......但它不在那里.(也不是,as或者hiding就此而言.)

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

看起来GHC至少遵循规范的字母,因为它会愉快地允许你定义一个名字实际上是变量的变量qualified.很奇怪,但也是如此.所以看起来这个名字在一个上下文中只是"特殊的".相比之下,您永远不能命名变量module.我们本可以只在文件的开头使这个词特别...但我们没有.

AJF*_*mar 8

qualified,as并且hiding仅作为关键字出现在特定位置,因此可以用作变量名称.

  • 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
Run Code Online (Sandbox Code Playgroud)

所以,考虑到这一点,我认为这确实是一个设计决策,我认为很多语言*都可以做到包括.

值得指出的deriving可能是这些词之一,因为它总是遵循数据声明foreign,因为它只保留FFI扩展.


*特别是javascript,它的主要是无意义的保留字!