在Haskell中使用派生实例时,是否可以派生任意类型的函数,还是仅限于特定函数?
答案 0 :(得分:9)
您可以在haskell 98中派生以下类的实例:Eq,Ord,Enum,Ix,Bounded,Read和Show。
使用ghc扩展,您还可以派生以下类的实例:Typeable,Data,Functor,Foldable和Traversable。还有一个ghc扩展,允许newtype从其实现类型派生实例。
您无法派生任意类的实例,原因很简单,因为如果没有关于相关类的特殊知识,haskell将不知道如何生成必要的函数。
答案 1 :(得分:6)
根据编译器知道如何为您派生的内容,您将被限制在特定的类中。使用预处理器或模板Haskell,如果您知道为特定类型生成函数实现的一般方法,您自己可以编写新的派生机制。
答案 2 :(得分:6)
另外两个答案是正确的。但是如果你需要更多,那么hackage上的一些软件包可以处理更多。我非常喜欢Data.Derive,因为你可以直接生成源代码(为了兼容性)或者将它挂钩到Template Haskell来在编译时完成它。已经支持各种类,并且很容易为您自己添加支持。摘要:一个该死的精美图书馆的广告宣传: - )
答案 3 :(得分:4)
要添加到Don的答案:为数据类型派生自定义功能称为 generic programming ,并且有一个lot of literature。预处理器和模板Haskell不是唯一的解决方案;有关其他选项的文献列表,请参阅其中一篇概述论文。