2013-10-03 67 views
2

我想知道如果一個清單是第二清單的前綴使用下面的代碼:推斷類型是不夠的一般,

prefix :: [a] -> [b] -> Bool 
prefix [] _ = True 
prefix _ [] = False 
prefix (x:xs) (y:ys) = if (x==y) then prefix xs ys else False 

但它返回一個錯誤:

Inferred type is not general enough 
*** Expression : prefix 
*** Expected type : [a] -> [b] -> Bool 
*** Inferred type : [a] -> [a] -> Bool 

燦有人幫我讓這個工作?

回答

10

您的類型簽名聲稱這兩個列表可以有不同的類型,但它們不能。所以編譯器會抱怨說,它推斷出的類型不如您要求的類型。

7

這是因爲您正在比較使用(x==y)命名爲ab的類型。檢查的==類型,這意味着他們是同一類型,其中有一個平等的測試:

Prelude> :t (==) 
(==) :: Eq a => a -> a -> Bool 

這樣推斷類型簽名實際上是Eq a => [a] -> [a] -> Bool