noob“重复实例声明”(再次)

时间:2015-09-03 12:42:22

标签: haskell

是的...对不起以前曾经问过这个问题,但通常是关于某些特别复杂的内容,以至于它难以理解

天真的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等然后这个是怎么做的(就狗而言)

我错过了什么

1 个答案:

答案 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提供任何其他实例声明。