2011-11-24 56 views
20

爲什麼當我在Haskell執行範圍,這個工程:爲什麼Haskell系列在使用[LT .. GT]時需要空格?

[LT .. GT] 

但這並不:

[LT..GT] 

的,什麼是這個神祕的錯誤意味着:

<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) 

但是,當我使用Ints時,第二種形式(不含空格)的作品:

[1..3] 
+0

你會得到什麼錯誤信息?當我嘗試時,我得到了一個相當有用的... – delnan

+0

GHCi接受它導致'[1,2,3]'。也許其他一些編譯器讀取'1.'作爲浮點數,然後它就沒有任何意義。 – Hauleth

+0

@Hauleth:其實它確實適用於'[1..3]',你的解釋只能說明爲什麼它不起作用。 – Tarrasch

回答

27

這是因爲LT..被解釋爲LT模塊中的.運算符。


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

這意味着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. 

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

在Haskell,一個section是具有部分應用,例如中綴運算符:如果使用合格的名稱與非現有的庫顯示同樣的信息(* 3),相當於\x -> x * 3

對於您的情況,LT..被解釋爲中綴.運算符,並且GT是由此運算符組成的部分的一部分。

一節必須用括號括起來,而且由於誤解沒有,解析器會像這樣抱怨。

錯誤又如:

Prelude> [* 3] 

<interactive>:1:2: 
    A section must be enclosed in parentheses thus: (* 3) 
+7

...和模塊名稱可能不是'[0-9] +。*'的形式,所以數字沒有歧義。 –

+0

更新了錯誤的問題 - 你能解釋一下嗎? – drozzy

+0

@drozzy:查看更新。 – kennytm

16

由於maximal munch rule的,LT..被解釋爲LT模塊中的(.)操作者的限定名。由於您可以在Haskell中定義自己的操作符,因此該語言允許您以與函數相同的方式完全限定操作符的名稱。

當運算符的名稱以.開頭時,這會導致模糊,在範圍中使用..,該運算符的名稱使用maximal munch規則解析,該規則說明最長匹配獲勝。例如,Prelude..是函數組合運算符的限定名稱。

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

之所以[1..3][x..y]的作品,是因爲模塊名稱必須以大寫字母開頭,所以1..x..不能合格的名稱。

+0

我明白了......但是我怎麼知道我犯了這樣的錯誤呢?我編輯了這個問題來顯示錯誤 - 你能解釋一下嗎? – drozzy

+0

@drozzy:這裏的錯誤信息可能會更好。 「無法加載LT的接口」基本上意思是「無法找到模塊LT」,我認爲這樣會更容易理解問題。 – hammar

+0

詞法分析器[對待'LT..'不同於'LT ..'](http://www.haskell.org/onlinereport/lexemes.html#sect2.4)(見該部分末尾的表格)。第一個錯誤來自於缺少'LT'(它既沒有導入也沒有定義)。由於第二個錯誤,Haskell仍然認爲'LT..'是一個具有未指定固定性的操作符(因此插入''''');因爲它不能解析'[操作標識符]',所以假定'LT..GT'實際上是一個寫''\ x - > x \'LT .. \ GT'的嘗試,但是這個語法糖只能是當用圓括號括起來時使用:'[(\'LT .. \'GT)]'。 – 2011-11-24 19:28:41

3

Failed to load interface for `LT':

Kenny和哈馬已經解釋了這句話的意思:LT..被假定爲LT模塊中的.功能。由於沒有LT模塊,您的解釋程序自然無法加載它。

A section must be enclosed in parentheses thus: (LT.. GT)

沿着同樣,假設LT..是對LT模塊中的.函數的引用,你的解釋顯然是假設你是用方括號代替括號中的錯誤,以一個「部分「(例如,部分是(+1))。

這只是Haskell語言中令人討厭的小疣;只記得使用空格。

相關問題