如果我嘗試> fst(a, b)
其中a
,b
未定義,我得到的錯誤是b
未定義。即使嘗試snd(a, b)
,它也是首先導致錯誤的b
。我有一個命令式編程的背景。我想知道這是否是某種我不明白的懶惰。評估Haskell數據類型中的未定義元素
回答
我認爲FUZxxl的評論是絕對正確的。當我鍵入擁抱REPL:
Hugs> fst(a,b)
ERROR - Undefined variable "b"
Hugs> snd(a,b)
ERROR - Undefined variable "b"
這不是一個懶惰/急於評價的事情 - 當擁抱檢查,以確保fst(a,b)
是有效的Haskell代碼,它注意到a
和b
沒有定義。這兩個字母在Haskell中沒有特殊含義,它們就像任何其他語言中的變量一樣!
這就像在Java中去:
System.out.println(a);
而且從來沒有說什麼a
是!你會,而不是寫類似:
String a = "Hello world."
System.out.println(a);
爲了解決這個問題,你可以定義a
和b
在let聲明,如:
>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
這裏你會看到什麼:
Prelude> fst (undefined, undefined)
*** Exception: Prelude.undefined
Prelude> snd (undefined, undefined)
*** Exception: Prelude.undefined
正如你所看到的,在訪問一個未定義的元素的計算結果爲不確定的值。
懶惰使我們避免了評估整個結構,然而,
Prelude> snd (undefined, 2)
2
您的意見建議,你可能已經忘記了申報一些特定的變量,a
和b
。
@Zach,我想我還不夠清楚。這是事情。由於a和b未定義,我期待錯誤。但是,編譯器在檢查a和b的存在時,應該首先告訴我a未定義。 (我輸入了一對作爲第一個元素)。我期待錯誤。拋棄我的是評估變量的順序。感謝您的及時答覆。 – schatten
我認爲你的問題是爲什麼它抱怨b而不是a,那是因爲haskell任意評估論據。也就是說,你永遠不會知道哪一個首先被評估。就你而言,顯然,haskell在偶然之前評估了b,這就是爲什麼它會抱怨b而不是a。
- 1. 類型錯誤:「未定義」不是(評估「ime.registIMEKey()」)的函數
- 2. 類型錯誤:未定義」不是一個函數(評估 'myAudio.play()')」
- 3. 未定義不是函數(評估'firebase.initializeApp')
- 4. 類型錯誤:「未定義」不是(評估「mockBackend.expectPost(
- 5. 類型錯誤:「未定義」不是(評估「window.frames [‘內容’] document.location。」)
- 6. 類型錯誤:「未定義」不是(評估「requireDirs.forEach」)
- 7. Haskell返回自定義數據類型
- 8. Haskell自定義數據類型
- 9. 模型元素未定義
- 10. C++ - 數據類型不同地評估
- 11. Haskell定義類型
- 12. Haskell中空函數的評估
- 13. Haskell不評估塊
- 14. Haskell - span elem:評估
- 15. Haskell評估時限
- 16. 類型類Haskell中的數據類型
- 17. Haskell自定義數學類型和類
- 18. 如何從元組中定義的元素定義爲haskell中的類型同義詞
- 19. 評估圖中的錯誤WindowButtonDownFcn-未定義的函數在MATLAB指南類中
- 20. 未定義不是對象(評估'this.props.navigator.replace')
- 21. 未定義不是對象(評估'NativeModules.RNSearchBarManager.ComponentHeight')
- 22. 「未定義」不是(評估「field.getAttribute」)
- 23. 未定義不是(評估「this.props.navigation.navigate」)
- 24. 未定義不是(評估「_reactNativeRouterFlux.Actions.chat」)
- 25. 未定義不是對象(評估'this.fetchData()。')
- 26. 未定義不是(評估「props.item.txt」)
- 27. 未定義不是對象(評估'RNFSFileTypeRegular')
- 28. 未定義不是(評估「value.phrase.replace」)
- 29. Haskell:列表創建評估列表元素
- 30. 在OO中指定數據類型Haskell
我有點困惑。你之前是否在沒有定義'a'或'b'的情況下鍵入'fst(a,b)',或者是否鍵入了類似'fst(undefined,undefined)'的類型('undefined'是一個特殊的變量,評價)?在Haskell中,當你使用它時必須定義任何東西。 Haskell不是腳本語言。編譯器可以檢查變量是否以任意順序存在。 – fuz
@FUZxxl,我輸入fst(a,b)而沒有定義。我在做YAHT教程,在那裏我需要嘗試fst('a','b')。我犯了一個錯誤。但讓我覺得奇怪的是編譯器評估變量的順序。如果它是任意的,那很明顯,爲什麼我得到了這個例外。 – schatten
變量尚未被評估,編譯器試圖解析並理解你寫的內容。這個過程絕不是懶惰。 – yatima2975