使用[LT .. GT]时为什么Haskell范围需要空格?

And*_*yuk 20 haskell

为什么当我在Haskell中使用范围时,这有效:

[LT .. GT]
Run Code Online (Sandbox Code Playgroud)

但这不是:

[LT..GT]
Run Code Online (Sandbox Code Playgroud)

这个神秘的错误意味着什么:

<interactive>:1:2:
    Failed to load interface for `LT':
      Use -v to see a list of the files searched for.

<interactive>:1:2:
    A section must be enclosed in parentheses thus: (`LT..` GT)
Run Code Online (Sandbox Code Playgroud)

但是,当我使用Ints时,第二种形式(没有空格)有效:

[1..3]
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 27

这是因为LT..被解释为模块中的.运算符LT.


<interactive>:1:2:
    Failed to load interface for `LT':
      Use -v to see a list of the files searched for.
Run Code Online (Sandbox Code Playgroud)

这意味着GHC无法找到名为的模块LT.如果对不存在的库使用限定名称,则会显示相同的消息:

Prelude> SDJKASD.sdfhj

<interactive>:1:1:
    Failed to load interface for `SDJKASD':
      Use -v to see a list of the files searched for.
Run Code Online (Sandbox Code Playgroud)
<interactive>:1:2:
    A section must be enclosed in parentheses thus: (`LT..` GT)
Run Code Online (Sandbox Code Playgroud)

在Haskell中,section是具有部分应用程序的中缀运算符,例如(* 3),相当于\x -> x * 3.

在您的情况下,LT..被解释为中缀.运算符,并且GT是使用此运算符形成的部分的一部分.

一个部分必须括在括号中,由于误解不会,解析器会这样抱怨.

另一个错误的例子:

Prelude> [* 3]

<interactive>:1:2:
    A section must be enclosed in parentheses thus: (* 3)
Run Code Online (Sandbox Code Playgroud)

  • ...和模块名称可能不是`[0-9] +.*`的形式,因此数字没有歧义. (7认同)

ham*_*mar 16

由于最大的munch规则,LT..将被解释为模块中(.)运算符的限定名称LT.由于您可以在Haskell中定义自己的运算符,因此该语言允许您以与函数相同的方式完全限定运算符的名称.

..当运算符的名称开头时.,这会导致使用范围的模糊性,这可以通过使用最大匹配规则来解决,该规则表示最长匹配获胜.

例如,Prelude..是函数组合运算符的限定名称.

> :info Prelude..
(.) :: (b -> c) -> (a -> b) -> a -> c   -- Defined in GHC.Base
infixr 9 .
> (+3) Prelude.. (*2) $ 42
87
Run Code Online (Sandbox Code Playgroud)

之所以[1..3][x..y]作品,是因为模块名称必须以大写字母开头,所以1..x..不能成为合格的名称.