(以更好的例子重新发布)与一个天真的OO头......我们去....
> class Drink a where
> class DrinkWithCaffeine a where
> class Fizzy a where
> class Still a where
> class Cola a where
> instance (Drink a) => DrinkWithCaffeine a
> instance (Drink a) => Fizzy a
> instance (Drink a) => Still a
> instance (Fizzy a) => Cola a
> instance (DrinkWithCaffeine a) => Cola a
和ghc去了
Duplicate instance declarations:
instance forall (k :: BOX) (a :: k). Fizzy a => Cola a
instance forall (k :: BOX) (a :: k). DrinkWithCaffeine a => Cola a
你看起来......并且有一个使用见证类型的解决方案,我可能会开始工作但是......我不明白这个问题是什么?
据称,编译器匹配右侧和bla bla ......?我不明白....我想我说...如果我有类型的狗类...那么它也是类型动物类动物......所以如果我调用方法foo等然后这个是怎么做的(就狗而言)
我错过了什么
答案 0 :(得分:1)
我理解的是instance (Fizzy a) => Cola a
真正意味着什么,a
是Cola
,但如果a
不是Fizzy
则会失败}}。在确定重复时,不考虑上下文(Fizzy a
)。
答案 1 :(得分:0)
请忽略我的问题,我没有正确阅读以前的回复...如果我做了我应该做的事
> class Drink a where
> class (Drink a) => DrinkWithCaffeine a where
> class (Drink a) => Fizzy a where
> class (Drink a) => Still a where
> class (DrinkWithCaffeine a,Fizzy a) => Cola a where
它有效。