假设
class A a where
m1 :: a -> a
m2 :: a -> a
m3 :: a -> a
...
可以使用 m1 编写 m2 和 m3 的默认实现。
将m2
和m3
留在A中更好还是将它们写为额外函数m2::A a => a -> a
A 之外?或者换句话说,是否值得最小化类 API 还是重要?
我(快速)检查了一些样式指南,例如 programmin guidelines以及 large-scale design 中的一些链接-问题,以及一些书籍(工艺和rwh),但找不到这本书的推荐。如果有涉及此类问题的演示文稿、博客或书籍,您能分享一些建议吗?
电子邮件列表线程 type class design讨论这个并可能强调最小化。
最佳答案
如果满足以下条件,请将他们保留在类(class)中
- 该类有多个不同的最小完整定义集,并且您无法先验地判断对于给定实例哪一个更简单/优雅。
- 可以合理地预期,特定类型(例如未装箱向量)将允许比默认类型更有效地实现
m2
和m3
。如果这些方法不能被重写,您就需要重写规则来实现这种优化。
具有大量“多余”方法的标准类的一个示例是(在较新的版本中)Foldable
。这部分是由于历史原因,但也因为不同的容器可能具有非常不同的严格性等属性,因此某些方法的默认实现可能对某些实例的性能非常不利。
如果这些注意事项均不适用于您的类,请将 m2
和 m3
排除在类之外。 (您可以随时将它们放入:如果您提供默认实现,它不会破坏任何人的代码。)
关于Haskell 风格和类型类设计(类型类应该最小化吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38917336/