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

时间:2016-08-12 11:54:14

标签: haskell

假设

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

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

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

我(快速)检查了一些样式指南,例如programmin guidelineslarge-scale design中的一些链接 - 问题,以及一些书籍(工艺和广播),但找不到建议这个。如果有关于此类问题的演示文稿,博客或书籍,请您分享一些指示吗?

电子邮件列表主题type class design讨论了这一点,并可能强调最小化。

1 个答案:

答案 0 :(得分:9)

如果

,请将他们留在课堂上
  • 该类有多个不同的最小完整定义集,您可以先验地告诉哪个更适合给定实例。
  • 可以合理地预期特定类型(例如,未装箱的向量)将允许m2m3比默认类型更有效的实现。如果这些方法不能覆盖,那么您需要采用重写规则进行此类优化。

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

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