2012-11-27 31 views
4

我對haskell非常陌生,試圖實現一個小而簡單的函數,它需要兩個字符串並告訴我在相同位置的相同字符的數量。Haskell中的Typeclass

ed :: (Integral b) => [a] -> [a] -> b 
ed _ [] = 0 
ed [] _ = 0 
ed [] [] = 0 
ed (x:xs) (y:ys) 
    | x == y = 1 + ed xs ys 
    | otherwise = ed xs ys 

這不會運行,因爲我的類型類定義是錯誤的。我有兩個字符串,需要返回一個整數,因此我上面寫的類型類定義。還有什麼我需要做的嗎?

+2

剛一說明:現在的第三種情況,'編[] []'是不必要的,它是已經被第一個覆蓋。 –

回答

11

類型簽名應該是

ed :: (Eq a, Integral b) => [a] -> [a] -> b 

這是因爲你的ed定義包括表達x == yxy都有類型a;爲了能夠測試它們是否相等,此類型必須實現Eq類型類別,該類型提供==/=運算符。

你得到的錯誤信息會包含這樣的事情:

Could not deduce (Eq a) arising from a use of `==' 
from the context (Integral b) 
    bound by the type signature for ed :: Integral b => [a] -> [a] -> b 
    at /home/dave/tmp/so.hs:(2,1)-(5,26) 
Possible fix: 
    add (Eq a) to the context of 
    the type signature for ed :: Integral b => [a] -> [a] -> b 

這是想告訴你這一點。

(順便說一句,你的代碼不處理時,當字符串的長度不同的情況。)

+0

非常感謝那個解釋。我想明白括號中的表達是做什麼的。那麼爲什麼還要在那裏加入Integral?這樣就不會滿足嗎?ed ::(Eq a)=> [a] - > [a] - > Int 我擡起頭看,但大部分資源似乎都在談論monads和東西。只是想要一個更簡單的解釋。另外,是的,我糾正了不同大小的東西,以及... – shashydhar

+0

抱歉格式不正確,無法正確格式化 – shashydhar

+4

@shashydhar'ed ::(Eq a)=> [a] - > [a] - > Int'也可以,只要你需要能夠得到不同類型的返回值('Int','Integer','Word',...),你需要在結果類型中是多態的。 –

4

由於的x == y,則需要添加一個方程類型約束:

ed :: (Integral b, Eq a) => [a] -> [a] -> b 

您可以註釋掉類型簽名,加載模塊在ghci中,讓它找出類型簽名:

Main> :t ed 
ed :: (Eq a1, Num a) => [a1] -> [a1] -> a