Haskell:类型类:多重继承示例

问题描述:

我开始知道我们可以使用类型类实现多重继承。我写了小的haskell代码,但无法找出问题所在。Haskell:类型类:多重继承示例

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
{-# LANGUAGE DeriveAnyClass #-} 
{-# LANGUAGE StandaloneDeriving #-} 

class (Eq a, Show a) => C a where 
    getHashCode :: a -> Integer 
    getHashCode obj = 123 


type Id = Int 
type Name = String 

data Employee = Employee Id Name deriving C 

当我试图加载上面的代码,我得到以下错误。对此有任何帮助。

No instance for (Eq Employee) 
     arising from the 'deriving' clause of a data type declaration 
    Possible fix: 
     use a standalone 'deriving instance' declaration, 
     so you can specify the instance context yourself 
    When deriving the instance for (C Employee) 
Failed, modules loaded: none. 

我在谷歌搜索了一段时间,但无法找到好的多重继承的例子。如果你提供了一些关于Haskell中多重继承的信息,那将会很有帮助。

参考:https://www.haskell.org/tutorial/classes.html

class (Eq a, Show a) => C a where 

并不意味着实现C类型自动实现EqShow,这意味着他们必须首先实现EqShow他们可以实现C之前。

Haskell中的A class与Java中的class不一样,或者它更接近于接口,但不能以相同的方式使用(也不应该)。 Haskell实际上并没有OOP意义上的继承或类的概念,因为它不是OOP语言。

但是,如果您想为某个类型自动创建EqShow实例,只需将它们添加到数据类型的deriving子句中即可。

+0

感谢您的回答。我们可以派生多个类型的类,但是我的问题是我想使用语句'class(Eq a,Show a)=> C a where',我该如何解决这个错误。 –