假设
class A a where
m1 :: a -> a
m2 :: a -> a
m3 :: a -> a
...
可以使用m1为m2和m3编写默认实现。
最好将m2
和m3
留在A中,还是将它们写为A外的额外函数m2 :: A a => a -> a
?或者换句话说,值得最小化类API还是重要?
我(快速)检查了一些样式指南,例如programmin guidelines和large-scale design中的一些链接 - 问题,以及一些书籍(工艺和广播),但找不到建议这个。如果有关于此类问题的演示文稿,博客或书籍,请您分享一些指示吗?
电子邮件列表主题type class design讨论了这一点,并可能强调最小化。
答案 0 :(得分:9)
如果
,请将他们留在课堂上m2
和m3
比默认类型更有效的实现。如果这些方法不能覆盖,那么您需要采用重写规则进行此类优化。具有许多“多余”方法的标准类的示例是(在更新的版本中)Foldable
。这部分是由于历史原因,也是因为不同的容器可能具有非常不同的stricness等属性,因此某些方法的默认实现可能对某些实例的性能非常不利。
如果这些注意事项都不适用于您的课程,请将m2
和m3
排除在课堂之外。 (您可以随时将它们放入:如果您提供默认实现,则不会破坏任何人的代码。)