我是Haskell的新手,對於類型的工作方式有點困惑。下面是什麼我試圖做一個簡單的例子:Haskell類型類應該如何使用類型?
data ListOfInts = ListOfInts {value :: [Int]}
data ListOfDoubles = ListOfDoubles {value :: [Double]}
class Incrementable a where
increment :: a -> a
instance Incrementable ListOfInts where
increment ints = map (\x -> x + 1) ints
instance Incrementable ListOfDoubles where
increment doubles = map (\x -> x + 1) doubles
(我意識到遞增列表中的每個元素可以非常簡單地完成,但是這是一個比較複雜的問題,只是一個簡化版本)
編譯器告訴我,我有多個聲明value
。如果我改變的ListOfInts
和ListOfDoubles
的定義如下:
type ListOfInts = [Int]
type ListOfDoubles = [Double]
那麼編譯器說(和同樣爲ListOfDoubles
「的‘遞增的ListOfInts’非法實例聲明:」如果我用NEWTYPE,例如,newtype ListOfInts = ListOfInts [Int]
,那麼編譯器告訴我「無法與實際類型'[b0]'」匹配預期類型'ListOfInts'(並且類似於ListOfDoubles
。
我對類型類的理解是它們有助於多態性,但我顯然缺少某些東西。在上面的第一個例子中,編譯器是否看到類型參數a
引用了一個記錄rd的字段名爲value
,看來我試圖以多種方式爲此類型定義increment
(而不是看到兩種不同的類型,一種字段的類型爲Int
s的列表,而另一種類型是一個列表Double
s)?對於其他嘗試類似嗎?
在此先感謝。
地圖期望一個列表,你給它ListOfInts – Arjan 2013-05-03 09:22:04