2010-03-13 44 views
9

在Haskell中派生实例时,是否可以为任意类型派生函数,还是仅限于特定函数?在Haskell中派生任意函数

+0

嘿嘿,+1,如果你发现这个是因为你希望你能为ADT派生'Test.QuickCheck.Arbitrary'。 :) – 2013-11-25 16:10:12

回答

9

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

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

你不能派生任意类的实例,原因很简单,因为haskell不知道如何在没有关于该类的特殊知识的情况下生成必要的函数。

+0

但GHC可以处理一些简单的情况。如果你说'newtype Bar = Bar Foo'并且Foo有一个Quux实例,那么GeneralizedNewtypeDeriving可以为你导出Bar的Quux实例。当然,这只是微不足道的展开,但总比没有好。 – jrockway 2010-03-13 04:59:54

6

根据编译器知道如何为您推导,您被限制在特定的类中。使用预处理器或模板Haskell,如果您知道为特定类型生成函数实现的一般方法,您可以自己编写新的派生机制。

6

另外两个答案是正确的。但是如果你需要更多的东西,那么就有一些可以处理更多的软件包。我喜欢Data.Derive很多,因为您可以直接生成源代码(为了兼容性)或将其挂接到模板哈斯克尔在编译时执行它。各种各样的类已经被支持,并且很容易为你自己添加支持。摘要:为该死的罚款库:-)

+0

我现在把它拿回来。我当时还没有试图增加对自己的支持,但我认为这很容易。它不是;它涉及重新编译我可以告诉的图书馆。但内置的支持仍然不错并且完整。 – luqui 2011-04-21 19:50:18

4

广告间距要添加到唐的回答是:获得定制功能为数据类型被称为generic programming并有一个lot of literature这个问题。预处理器和模板Haskell不是唯一的解决方案;请参阅其中一份概述文件,列出其他选项的文献。