Han*_*Sun 10 haskell functional-programming
代码如下所示:
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)
Run Code Online (Sandbox Code Playgroud)
这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.
Run Code Online (Sandbox Code Playgroud)
有没有人有这个想法?
sep*_*p2k 10
您不能使用用户定义的类派生.通常会deriving自动为给定类的方法生成代码,这是唯一可能的,因为编译器知道这些方法应该做什么,因此可以根据类型的结构生成合适的实现.对于用户定义的类,这显然是不可能的,因为编译器无法知道方法应该如何表现.
在你的情况下,看起来你想要的只是使用你的类所拥有的一个方法的默认实现,因此编译器不需要生成任何实现.当然,这意味着deriving根本没有必要,你可以只使用没有正文的实例声明.
PS:如果你总是想要使用该方法的默认实现,那么最好不要使用类,而只是定义myAnd为一个函数.
对于此特定问题,您可以简单地避免定义自定义类:
data TrafficLight = Red | Yellow | Green deriving Show
myAnd :: (Show a) => a -> a -> String
x `myAnd` y = (show x) ++ " and " ++ (show y)
Run Code Online (Sandbox Code Playgroud)
现在,myAnd适用于TrafficLights(以及所有其他Show能力类型).