2011-06-25 37 views
0

如果我嘗試> fst(a, b)其中a,b未定義,我得到的錯誤是b未定義。即使嘗試snd(a, b),它也是首先導致錯誤的b。我有一個命令式編程的背景。我想知道這是否是某種我不明白的懶惰。評估Haskell數據類型中的未定義元素

+4

我有點困惑。你之前是否在沒有定義'a'或'b'的情況下鍵入'fst(a,b)',或者是否鍵入了類似'fst(undefined,undefined)'的類型('undefined'是一個特殊的變量,評價)?在Haskell中,當你使用它時必須定義任何東西。 Haskell不是腳本語言。編譯器可以檢查變量是否以任意順序存在。 – fuz

+0

@FUZxxl,我輸入fst(a,b)而沒有定義。我在做YAHT教程,在那裏我需要嘗試fst('a','b')。我犯了一個錯誤。但讓我覺得奇怪的是編譯器評估變量的順序。如果它是任意的,那很明顯,爲什麼我得到了這個例外。 – schatten

+0

變量尚未被評估,編譯器試圖解析並理解你寫的內容。這個過程絕不是懶惰。 – yatima2975

回答

5

我認爲FUZxxl的評論是絕對正確的。當我鍵入擁抱REPL:

Hugs> fst(a,b) 
ERROR - Undefined variable "b" 
Hugs> snd(a,b) 
ERROR - Undefined variable "b" 

這不是一個懶惰/急於評價的事情 - 當擁抱檢查,以確保fst(a,b)是有效的Haskell代碼,它注意到ab沒有定義。這兩個字母在Haskell中沒有特殊含義,它們就像任何其他語言中的變量一樣!

這就像在Java中去:

System.out.println(a); 

而且從來沒有說什麼a是!你會,而不是寫類似:

String a = "Hello world." 
System.out.println(a); 

爲了解決這個問題,你可以定義ablet聲明,如:

>let (a,b) = (1,2) in fst(a,b) 

>let tup = (1,2) in fst tup 

>let a=1;b=2 in fst(a,b) 

where聲明

>fst(a,b) where a=1;b=2 

另外,定義叫什麼(例如,「TestTuple一些文件。HS「)

a = 1 
b = 2 

和擁抱,去:

>:load TestTuple.hs 
>fst(a,b) 
1 

雖然你注意,你正在使用擁抱,僅供參考,在GHCi,你也可以在REPL定義變量像這樣:

>let a = 1 
>let b = 2 
>fst(a,b) 
1 
>snd(a,b) 
2 
1

這裏你會看到什麼:

Prelude> fst (undefined, undefined) 
*** Exception: Prelude.undefined 
Prelude> snd (undefined, undefined) 
*** Exception: Prelude.undefined 

正如你所看到的,在訪問一個未定義的元素的計算結果爲不確定的值。

懶惰使我們避免了評估整個結構,然而,

Prelude> snd (undefined, 2) 
2 

您的意見建議,你可能已經忘記了申報一些特定的變量,ab

+0

@Zach,我想我還不夠清楚。這是事情。由於a和b未定義,我期待錯誤。但是,編譯器在檢查a和b的存在時,應該首先告訴我a未定義。 (我輸入了一對作爲第一個元素)。我期待錯誤。拋棄我的是評估變量的順序。感謝您的及時答覆。 – schatten

0

我認爲你的問題是爲什麼它抱怨b而不是a,那是因爲haskell任意評估論據。也就是說,你永遠不會知道哪一個首先被評估。就你而言,顯然,haskell在偶然之前評估了b,這就是爲什麼它會抱怨b而不是a。

相關問題