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
……但它不在那里。 (就此而言,as
或 hiding
也不是。)
现在我想知道……这是报告中的一个意外疏忽吗?或者这是故意的设计决定?
看来 GHC 至少遵循规范的字母,因为它会很高兴地允许您定义一个名称实际上是 qualified
的变量。很奇怪,但确实如此。所以看起来这个名字在一种情况下只是 "special" 。相比之下,您可以从不 命名变量module
。我们本可以只在文件的开头使这个词特殊……但我们没有。
qualified
、as
、hiding
只作为关键字出现在特定的地方,因此可以作为变量名。
qualified
只出现在 import
. 之后
as
只出现在 import qualified PACKAGE
之后
hiding
只出现在 import [qualified] PACKAGE [as NAME]
之后
当您指出 module
可能是这些特定于展示位置的关键字之一时,我明白您的意思了,但是命名任何内容 module
似乎违反直觉。也许 Haskell 的早期版本允许在一个文件中包含多个模块?
qualified
和 hiding
也可以这样说,但我经常使用 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不禁止每个文件有多个模块。该规范根本不讨论文件。 (但我不知道有任何实现允许它。)
好的,所以我花了一整天的时间研究 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
……但它不在那里。 (就此而言,as
或 hiding
也不是。)
现在我想知道……这是报告中的一个意外疏忽吗?或者这是故意的设计决定?
看来 GHC 至少遵循规范的字母,因为它会很高兴地允许您定义一个名称实际上是 qualified
的变量。很奇怪,但确实如此。所以看起来这个名字在一种情况下只是 "special" 。相比之下,您可以从不 命名变量module
。我们本可以只在文件的开头使这个词特殊……但我们没有。
qualified
、as
、hiding
只作为关键字出现在特定的地方,因此可以作为变量名。
qualified
只出现在import
. 之后
as
只出现在import qualified PACKAGE
之后
hiding
只出现在import [qualified] PACKAGE [as NAME]
之后
当您指出 module
可能是这些特定于展示位置的关键字之一时,我明白您的意思了,但是命名任何内容 module
似乎违反直觉。也许 Haskell 的早期版本允许在一个文件中包含多个模块?
qualified
和 hiding
也可以这样说,但我经常使用 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不禁止每个文件有多个模块。该规范根本不讨论文件。 (但我不知道有任何实现允许它。)