Haskell中任意函数的推导

Haskell中任意函数的推导,haskell,types,typeclass,derived-instances,Haskell,Types,Typeclass,Derived Instances,在Haskell中使用派生实例时,是否可以派生任意类型的函数,或者我们仅限于特定的函数?您可以在Haskell 98中派生以下类的实例:Eq、Ord、Enum、Ix、Bounded、Read和Show 使用ghc扩展,您还可以派生以下类的实例:Typeable、Data、Functor、Foldable和Traversable。还有一个ghc扩展,允许新类型从其实现类型派生实例 您不能派生任意类的实例,原因很简单,因为haskell不知道如何生成所需的函数,而没有关于所讨论的类的专门知识。就编译

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

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

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


您不能派生任意类的实例,原因很简单,因为haskell不知道如何生成所需的函数,而没有关于所讨论的类的专门知识。

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

其他两个答案是正确的。但是如果你需要更多,有一些黑客软件包可以处理更多的问题。我非常喜欢,因为您可以直接生成源代码(为了兼容性),或者将其挂接到模板Haskell中,以便在编译时执行。广泛的类已经得到支持,为自己的类添加支持非常容易。小结:一个非常好的库的广告宣传:-)

要添加到Don的回答中:为数据类型派生自定义功能被调用了,关于这一点有很多问题。预处理器和模板Haskell不是唯一的解决方案;有关其他选项,请参阅包含文献列表的概述文件。

但GHC可以处理一些简单的情况。如果您说
newtypebar=Bar-Foo
并且Foo有一个Quux实例,那么GeneralizedNewtypeDeriving可以为您派生Bar的Quux实例。当然,这只是一个琐碎的展开,但总比什么都没有好。我现在收回这个。当时我还没有试着为自己添加支持,但我认为这很容易。事实并非如此;它涉及到根据我所知道的重新编译库。但是内置的支持仍然很好而且完整。呵呵,+1如果你发现这一点是因为你希望能够派生出ADT的
Test.QuickCheck.arbitral
。)