具有代数数据类型的 Haskell 类型类

标签 haskell typeclass algebraic-data-types

我有一些代数数据类型 A、B 和 C,每个都实现了这个类:

class Dog a where
   dog :: a -> Bool

如果我创建一个新的代数数据类型:
data D = A | B | C

有没有一种简单的方法让 D 实现 Dog 而不必再次为 A、B 和 C 重新定义每个实例?

谢谢

最佳答案

在回答之前,我应该指出您可能会陷入一个常见的初学者对 ADT 的误解。请记住,Haskell 有两个独立的 namespace 用于类型和术语级别。所以如果我们写:

data A = Foo
data B = Bar
data C = Baz
data D = A | B | C

...那么类型之间没有联系 A和构造函数 A类型 D .因此,我怀疑(但不完全确定!)您要问的问题对于类型 D 具有以下格式, 反而:
data D = A A | B B | C C

在这种情况下,简短的回答是“不”。您可能希望加入 deriving Dog或者一些这样的事情并被完成,但语言不提供这种便利。也就是说,有一些通用编程包可以提供帮助:只需检查 Hackage 包列表并搜索“deriv”,您将获得大约 10 次点击。

关于具有代数数据类型的 Haskell 类型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6687810/

相关文章:

haskell - 将函数列表中的每个函数逐步应用于一个值并累积结果的函数的名称是什么?

haskell - 如何将 Reader Monad 与 (Int -> Int) 一起使用?

haskell - 为什么 Control.Monad.Morph.hoist 有 Monad 约束?

haskell - 如何将一元函数作为带有灵活类型变量的参数传递?

haskell - 查找 Haskell 树中节点的值

haskell - 如何使用记录设计扩展

http - 为什么在打印hGetContents 的结果后不能使用hPutStr?

haskell - 如何在加速示例包的示例上启用 CUDA?

haskell - 为什么说类型类是存在的?

c# - 二进制值的数据类型是什么?是字符串数据类型吗?