在Haskell中派生实例时,是否可以为任意类型派生函数,还是仅限于特定函数?在Haskell中派生任意函数
回答
您可以在haskell 98中派生出以下类的实例:Eq,Ord,Enum,Ix,Bounded,Read和Show。
使用ghc扩展,您还可以派生下列类的实例:Typeable,Data,Functor,Foldable和Traversable。还有一个ghc扩展,它允许newtype从其实现类型派生实例。
你不能派生任意类的实例,原因很简单,因为haskell不知道如何在没有关于该类的特殊知识的情况下生成必要的函数。
但GHC可以处理一些简单的情况。如果你说'newtype Bar = Bar Foo'并且Foo有一个Quux实例,那么GeneralizedNewtypeDeriving可以为你导出Bar的Quux实例。当然,这只是微不足道的展开,但总比没有好。 – jrockway 2010-03-13 04:59:54
根据编译器知道如何为您推导,您被限制在特定的类中。使用预处理器或模板Haskell,如果您知道为特定类型生成函数实现的一般方法,您可以自己编写新的派生机制。
另外两个答案是正确的。但是如果你需要更多的东西,那么就有一些可以处理更多的软件包。我喜欢Data.Derive很多,因为您可以直接生成源代码(为了兼容性)或将其挂接到模板哈斯克尔在编译时执行它。各种各样的类已经被支持,并且很容易为你自己添加支持。摘要:为该死的罚款库:-)
我现在把它拿回来。我当时还没有试图增加对自己的支持,但我认为这很容易。它不是;它涉及重新编译我可以告诉的图书馆。但内置的支持仍然不错并且完整。 – luqui 2011-04-21 19:50:18
广告间距要添加到唐的回答是:获得定制功能为数据类型被称为generic programming并有一个lot of literature这个问题。预处理器和模板Haskell不是唯一的解决方案;请参阅其中一份概述文件,列出其他选项的文献。
- 1. Haskell派生显示错误
- 2. 任何方式在派生类中使用基构造函数?
- 3. 函数在Haskell平台中生成2011.2.0.1
- 4. 在派生类中定义函数
- 5. 私人虚函数在派生类中
- 6. 任何派生
- 7. 派生式并显示在Haskell
- 8. Haskell:任何debugShow函数?
- 9. Haskell函数返回任意数量的字段作为列表
- 10. 函数生成任意签名
- 11. 如何在Haskell中为GADT派生数据实例?
- 12. 纯虚函数派生类
- 13. 参考派生函数
- 14. 派生类依赖函数
- 15. 绘制函数和派生函数
- 16. 派生列任务
- 17. Haskell monad返回任意数据类型
- 18. 使用Haskell中的命令行参数分派纠正函数
- 19. Haskell中的任意字符串生成器(Test.QuickCheck.Gen)
- 20. 在基类funciton中使用此派生类成员函数,其中派生类中的overriden函数
- 21. 从(成员)函数中派生类型
- 22. 派生类中的虚函数命名
- 23. Delphi 2010中的密钥派生函数
- 24. ssis派生组件中的isdate函数
- 25. 派生类中的VB.NET构造函数
- 26. 成员函数隐藏在派生
- 27. 派生类成员函数在C++
- 28. OCaml函子,Haskell类型类和多重派生
- 29. 将函数放置在基类中的任何派生类中使用?
- 30. Haskell:派生Show for Fix类型
嘿嘿,+1,如果你发现这个是因为你希望你能为ADT派生'Test.QuickCheck.Arbitrary'。 :) – 2013-11-25 16:10:12