【发布时间】:2013-05-03 17:23:52
【问题描述】:
我是 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]
然后编译器会说“'Incrementable ListOfInts' 的非法实例声明”(对于ListOfDoubles 也是如此。如果我使用新类型,例如newtype ListOfInts = ListOfInts [Int],那么编译器会告诉我“无法匹配预期的类型 'ListOfInts ' 实际类型为 '[b0]'" (ListOfDoubles 也是如此。
我对类型类的理解是它们促进了多态性,但我显然遗漏了一些东西。在上面的第一个示例中,编译器是否只看到类型参数a 引用了一个带有名为value 的字段的记录,并且看起来我正在尝试以多种方式为这种类型定义increment(而不是而不是看到两种不同的类型,一种具有类型为Ints 列表的字段,另一种类型为Doubles 列表的字段?其他尝试也是如此?
提前致谢。
【问题讨论】:
-
map 需要一个列表,你给它 ListOfInts