我是 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' 的非法实例声明”(对于 'Incrementable ListOfInts' 也是如此ListOfDoubles
。如果我使用 newtype,例如 ,newtype ListOfInts = ListOfInts [Int]
那么编译器会告诉我“无法将预期类型 'ListOfInts' 与实际类型 '[b0]' 匹配” "(对于ListOfDoubles
.
我对类型类的理解是它们促进了多态性,但我显然遗漏了一些东西。在上面的第一个示例中,编译器是否只看到 type 参数引用了a
一个带有一个名为一个字段的类型是s 的列表,另一个字段的类型是 s 的列表)?对于其他尝试也是如此?value
increment
Int
Double
提前致谢。