haskell中的暂停点何时应该与额外的“空间”一起工作?

时间:2016-02-18 05:58:14

标签: parsing haskell space

在定义列表时,我们使用没有额外空格的挂点,如下所示:

Prelude> [3..5]
[3,4,5]
Prelude> [3 .. 5]
[3,4,5]

但是与枚举一起使用似乎需要额外的空格:

Prelude> [LT..GT]

<interactive>:2:2: Not in scope: ‘LT..’

<interactive>:2:2:
    A section must be enclosed in parentheses thus: (LT.. GT)
Prelude> [LT .. GT]
[LT,EQ,GT]

所以问题是:它是Haskell中的语法规则吗?或者与实现相关?

1 个答案:

答案 0 :(得分:7)

LT是一个有效的模块名称,因此您在该模块名称(或别名)中引用函数(.),而不是枚举的语法糖。由于您没有导入LT(模块,而不是数据构造函数),因此所有假设函数都不在范围内。

这是一个虚假的例子,不会导致超出范围的错误:

Prelude> import Prelude hiding (LT)
Prelude> import qualified Prelude as LT
Prelude LT> [LT..GT]

<interactive>:3:2:
    A section must be enclosed in parentheses thus: (LT.. GT)

即使有括号,它也不会打字。部分错误也可以通过一个列表来实现:

Prelude> [+ 1]
<interactive>:1:2:
    A section must be enclosed in parentheses thus: (+ 1)

Prelude> :t [(+ 1)]
[(+ 1)] :: Num a => [a -> a]

TL; DR:除非您想要指定其他模块中的内容,否则请确保.与有效模块名称之间有一些空格。