2015-05-17 54 views
6

的代码看起来是这样的:在Haskell中,如何自动派生这样的自定义类?

class MyAnd a where 
    myAnd :: (Show a) => a -> a -> String 
    x `myAnd` y = (show x) ++ " and " ++ (show y) 

data TrafficLight = Red | Yellow | Green deriving(Show, MyAnd) 

这里MyAnd是具有功能myAnd一个类型的类,我认为这是通用的,唯一的限制是a已经到了Show类的一个实例..

TrafficLight类型,它已经从Show型类派生的。然而,当我编译代码时,编译器抱怨

Can't make a derived instance of ‘MyAnd TrafficLight’: 
     ‘MyAnd’ is not a derivable class 
    In the data declaration for ‘TrafficLight’ 
Failed, modules loaded: none. 

有没有人有关于此的想法?

回答

8

不能使用用户定义的类派生。通常deriving自动生成给定类的方法,这是唯一可能的,因为编译器知道什么方法都应该做的,因此可以基于你的类型的结构适合实现代码。这对于用户定义的类来说显然是不可能的,因为编译器无法知道方法应该如何表现。

在你的情况下,它看起来像你想要的是使用一个方法你的类有默认的实现,所以没有实施将需要由编译器生成。当然,这意味着deriving是不是所有必要的,你可以只使用一个实例声明没有身体。 PS:如果你总是希望使用该方法的默认实现,那么最好不要使用类,而只需要将myAnd定义为一个函数。

+0

真,编译器不知道什么方法都应该做的。但是,也许这种语言的一个有价值的补充将是一种告诉它的方式。相关:http://stackoverflow.com/a/3864801/524504 – masterxilo

7

对于这个特定的问题,你可以简单地避免定义自定义类:

data TrafficLight = Red | Yellow | Green deriving Show 

myAnd :: (Show a) => a -> a -> String 
x `myAnd` y = (show x) ++ " and " ++ (show y) 

现在,myAnd适用于TrafficLight S(以及其他所有Show能够类型)。

相关问题