是的...对不起以前曾经问过这个问题,但通常是关于某些特别复杂的内容,以至于它难以理解
天真的OO头......我们去....class Animal a where
类Mammal m where
类Insect i where
实例(哺乳动物m)=>动物m
实例(昆虫i)=>动物我
和ghc去了
重复的实例声明:
instance forall (k :: BOX) (m :: k). Mammal m => Animal m
instance forall (k :: BOX) (i :: k). Insect i => Animal i
你看起来......并且有一个使用见证类型的解决方案,我可能会开始工作但是......我不明白这个问题是什么?
据称,编译器匹配右侧和bla bla ......?我不明白....我想我说...如果我有类型的狗类...那么它也是类型动物类动物......所以如果我调用方法foo等然后这个是怎么做的(就狗而言)
我错过了什么
答案 0 :(得分:7)
class Animal a where
class Animal a => Mammal a where
class Animal a => Insect a where
这就是你表达超类关系的方式。实例声明用于实际创建类的类型实例。
instance Animal Ant where
instance Insect Ant where
你写了
instance (Mammal m) => Animal m
instance (Insect i) => Animal i
Haskell要求每个类和类型只有一个实例。因此仅由=>
的右边部分确定。所以它看到了
instance Animal a
并抱怨。你可能有
instance Animal (Maybe a)
以及
instance Animal Int
但如果你有
instance Animal a
然后您无法为Animal
提供任何其他实例声明。