子类关系与一个类的方法可以使用其他类型类的方法实现的事实之间的关系是什么?
例如,定义Applicative
之类的class Functor a => Applicative a
非常令人困惑,因为这会强制您添加Functor
实例,然后才能添加Applicative
但是,您可以编写一个像instance Applicative a => Functor a
这样的实例声明来确保每个Applicative
也是Functor
。
使用该方法背后的原因是什么?并且,正如我所说,如果超类可以使用子类实例化,那么一个类型类是另一个超类的规则吗?
答案 0 :(得分:2)
这不是一个子类,而是一个类限制。在类声明中,这通常表明默认的多态操作使用来自该类型类的多态操作,尽管这是一个例外。
在这里,这并不重要,只是强加的限制,但它确实意味着作为Applicatve
实例意味着对象也是Functor
实例,允许{{1}无忧无虑地使用。我们如何操纵其中的值?
请记住,Haskell的典型性只是描述多态值的方法:它不等同于面向对象的结构。
如果您想查看实际的声明,可以找到<$>
的来源here。