我是Haskell的新手,面臨着我無法理解的「無法構造無限類型」的錯誤。實際上,除此之外,我還無法找到這個錯誤甚至意味着什麼的好解釋,所以如果你能超越我的基本問題並解釋「無限類型」的錯誤,我會非常感激它。爲什麼Haskell代碼會產生「無限類型」錯誤?
下面的代碼:
intersperse :: a -> [[a]] -> [a]
-- intersperse '*' ["foo","bar","baz","quux"]
-- should produce the following:
-- "foo*bar*baz*quux"
-- intersperse -99 [ [1,2,3],[4,5,6],[7,8,9]]
-- should produce the following:
-- [1,2,3,-99,4,5,6,-99,7,8,9]
intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:y:xs) = x:s:y:intersperse s xs
而這裏的試圖將其加載到解釋的錯誤:
Prelude> :load ./chapter.3.ending.real.world.haskell.exercises.hs
[1 of 1] Compiling Main (chapter.3.ending.real.world.haskell.exercises.hs, interpreted)
chapter.3.ending.real.world.haskell.exercises.hs:147:0:
Occurs check: cannot construct the infinite type: a = [a]
When generalising the type(s) for `intersperse'
Failed, modules loaded: none.
感謝。
-
下面是一些修正的代碼以及處理在Haskell 「無限型」 錯誤的一般準則:
更正代碼
intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:xs) = x ++ s:intersperse s xs
什麼問題是:
我的簽名狀態s第二個散佈的參數是列表。因此,當我模式匹配「s(x:y:xs)」時,x和y變成列表。然而,我將x和y當作元素,而不是列表。
指引爲應付「無限型」的錯誤:
大多數時候,當你得到這個錯誤,你忘了你的類型正在處理的各種變量,而你試圖使用一個變量,就好像它是一種其他類型的東西,而不是它的樣子。仔細查看一切是什麼類型與你如何使用它,這通常會發現問題。
另一個好的提示:明確聲明類型。這給了編譯器一些東西來檢查。 – 2009-05-01 18:47:23
所以這解決了這個問題,但爲什麼編譯器會說「不能構造無限類型?」。那是什麼意思?如果問題在於您試圖對不支持這些操作的類型執行操作,爲什麼編譯器不這樣說? – freedrull 2010-03-08 07:13:31
+1爲問題的結構(問題糾正 - 問題是 - 準則) – Dacav 2010-05-27 09:36:51