Haskell 风格和类型类设计(类型类应该最小化吗?)

标签 haskell

假设

class A a where
   m1 :: a -> a 
   m2 :: a -> a
   m3 :: a -> a
   ...

可以使用 m1 编写 m2 和 m3 的默认实现。

m2m3留在A中更好还是将它们写为额外函数m2::A a => a -> a A 之外?或者换句话说,是否值得最小化类 API 还是重要?

我(快速)检查了一些样式指南,例如 programmin guidelines以及 large-scale design 中的一些链接-问题,以及一些书籍(工艺和rwh),但找不到这本书的推荐。如果有涉及此类问题的演示文稿、博客或书籍,您能分享一些建议吗?

电子邮件列表线程 type class design讨论这个并可能强调最小化。

最佳答案

如果满足以下条件,请将他们保留在类(class)中

  • 该类有多个不同的最小完整定义集,并且您无法先验地判断对于给定实例哪一个更简单/优雅。
  • 可以合理地预期,特定类型(例如未装箱向量)将允许比默认类型更有效地实现 m2m3。如果这些方法不能被重写,您就需要重写规则来实现这种优化。

具有大量“多余”方法的标准类的一个示例是(在较新的版本中)Foldable 。这部分是由于历史原因,但也因为不同的容器可能具有非常不同的严格性等属性,因此某些方法的默认实现可能对某些实例的性能非常不利。

如果这些注意事项均不适用于您的类,请将 m2m3 排除在类之外。 (您可以随时将它们放入:如果您提供默认实现,它不会破坏任何人的代码。)

关于Haskell 风格和类型类设计(类型类应该最小化吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38917336/

相关文章:

haskell - 您将如何在 Haskell 中表示图(与旅行商问题相关的那种)

haskell - 功能队列类型

regex - 区分 Haskell 中的空正则表达式匹配和无匹配

multithreading - 简单的多线程Haskell占用大量内存

haskell - Scotty 帖子类型不允许效果

haskell - 树声明之间的区别?

haskell -/lib64/libtinfo.so.5 : no version information available

typescript - Haskell 在 Typescript 中的新类型?

testing - 任何 Haskell 测试框架中是否有 assertException?

haskell - c2hs - 匿名枚举?