【问题标题】:Haskell typeclasses with algebraic data types具有代数数据类型的 Haskell 类型类
【发布时间】:2011-07-14 02:25:38
【问题描述】:

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

class Dog a where
   dog :: a -> Bool

如果我创建一个新的代数数据类型:

data D = A | B | C

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

谢谢

【问题讨论】:

  • 您的意思是创建一个使用原始数据类型的新数据类型?或者将现有类型组合成一个单独的类型来替换它们?虽然,无论哪种情况,答案都可能是“不,不是真的”。 :T
  • Dog 与 D 有什么关系?你到底想做什么? dog :: D -> Bool dog A = True dog B = False 像这样?

标签: haskell typeclass algebraic-data-types


【解决方案1】:

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

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

...那么A 类型和D 类型的构造函数A 之间没有联系。因此,我怀疑(但不完全确定!)您打算提出的问题具有以下D 类型的格式,而不是:

data D = A A | B B | C C

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

【讨论】:

  • 感谢您的回答和正确的假设。这正是我想知道的。
猜你喜欢
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多