为什么当我在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)
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..不能成为合格的名称.