在Haskell中,如何自动派生这样的自定义类?

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为一个函数.


chi*_*chi 9

对于此特定问题,您可以简单地避免定义自定义类:

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能力类型).