haskell - 在 Haskell 中,如何自动派生这样一个自定义类?

标签 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)

这里MyAnd是具有函数 myAnd 的类型类,我认为它是通用的,唯一的约束是 a必须有 Show 的实例类(class)..

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.

有人对此有想法吗?

最佳答案

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

在您的情况下,您似乎只想使用您的类具有的一种方法的默认实现,因此编译器不需要生成任何实现。当然这意味着 deriving根本没有必要,您可以只使用没有正文的实例声明。

PS:如果您总是想使用该方法的默认实现,那么根本不使用类可能最有意义,而只需定义 myAnd作为一个函数。

关于haskell - 在 Haskell 中,如何自动派生这样一个自定义类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30288119/

相关文章:

scala - 如何使用vararg case类执行模式匹配?

javascript - 如何在功能上将各个时间戳聚合到时间范围中

c# - 使用 Func<T,TResult> 作为参数的方法

c++ - 如何将私有(private)成员函数作为参数传递

haskell - 如何为有文化的 Haskell 编程设置 vim 缩进?

haskell - `foldl`的实际使用

list - 如何在没有 GADT 或数据类型上下文的情况下定义 List 的 Eq 实例

haskell - 解释这段输出素数流的haskell代码

c - '#type' 在 Haskell 外部函数接口(interface)中意味着什么?

scala - 这些scala方法中下划线用法之间的差异