Haskell标准库类型类的替代实现

我看到很多人抱怨标准图书馆的一些类型类,例如“Monad应该需要Functor”,甚至“Monad应该要求适用”,“应用要点”,“Num不应该显示”等等
所以,我有一些问题:

>类型类依赖树的方式是否具有社区认为的“缺陷”的方式是否有争议,或者这仅仅是历史上的事情的结果?
>这样会有什么变化会破坏现有的代码?
>是否有实现“依赖”类依赖关系的基本类型类(特别是箭头,单子,应用等)的替代实现?

除了向后兼容性,由于Haskell处理类型类的相当简单的方法,有一些(主要是化妆品,但是乏味的处理)问题。

没有向上隐含的定义:Monad完全由纯和(>> =)定义; fmap和(*)可以用这些来写入。在“适当”层次结构中,每个实例都需要写出来。在这种情况下不是太糟糕,但是随着粒度的增加,每个实例的数量都增加了一些小功能。如果类定义可以根据自己的功能提供超类函数的默认实现,那么它将大大简化事情,因此,在超类中完全包含多个函数的函数(>> =)可以作为整个相关层次结构的定义。

语境膨胀:由于Num需要“Show”和“Eq”的“原因”,因为打印和比较数字的相等性是很常见的。这些是严格正交的,但是分离它们意味着所有这三个功能的功能现在必须在其类型中指定所有三个类。这在技术上是一件好事,但是再次,随着粒度的增加,功能类型签名也将增加。

单片依赖:类型类及其超类的层次结构可以添加到但不被更改或替换。如果一段代码感觉需要替换自己的一些普通类型的版本 – 比如说使用something like this替代Monad,那么这个层次被切断了;必须在某种程度上手动提供与Monad的其他定义的代码的兼容性,并且必须重新实现或翻译任何构建在其他定义上的类型类,即使只依赖于两个定义共享的一个行为子集。

没有明确的层次结构:正如上面所暗示的那样,在类的粒度上可以做出选择。例如,Pointed真的需要存在,还是只适用于适用?这里真的没有答案是普遍的理想,不应该有。

我怀疑,首先处理上述问题,更好地为现有类型班而作出的努力,之后更换类型课程将远远不如一个正式的痛苦,甚至更少。例如,@luqui提到的类型类同义词提案将是朝这个方向迈出的重要一步。

http://stackoverflow.com/questions/5730270/alternative-implementations-of-haskells-standard-library-type-classes

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Haskell标准库类型类的替代实现