10

在 Haskell 中使用派生实例时,是否可以为任意类型派生函数,或者我们是否仅限于特定函数?

4

4 回答 4

10

您可以在 haskell 98 中派生以下类的实例:Eq、Ord、Enum、Ix、Bounded、Read 和 Show。

使用 ghc 扩展,您还可以派生以下类的实例:Typeable、Data、Functor、Foldable 和 Traversable。还有一个 ghc 扩展允许新类型从其实现类型派生实例。

您不能派生任意类的实例,原因很简单,如果没有有关类的特殊知识,haskell 将不知道如何生成必要的函数。

于 2010-03-13T01:23:18.610 回答
6

就编译器知道如何为您派生而言,您仅限于特定的类。如果您知道为特定类型生成函数实现的一般方法,则可以使用预处理器或 Template Haskell 自己编写新的派生机制。

于 2010-03-13T03:29:44.370 回答
6

另外两个答案是正确的。但是如果你需要更多,有一些关于 hackage 的包可以处理更多。我非常喜欢Data.Derive,因为您可以直接生成源代码(为了兼容性)或将其挂接到 Template Haskell 以在编译时执行。已经支持广泛的类,并且很容易添加对您自己的支持。摘要:为一个该死的好图书馆做广告:-)

于 2010-03-13T18:55:08.440 回答
4

添加到唐的答案:为数据类型派生自定义功能称为通用编程,并且有很多关于此的文献。预处理器和模板 Haskell 不是唯一的解决方案;请参阅其中一篇概述文件,其中列出了其他选项的文献。

于 2010-03-16T21:14:53.517 回答