2014-12-28 44 views
2

子类关系和一个类的方法可以使用其他类型类的方法实现的事实之间有什么关系?Haskell子类的说明

例如,它是相当混乱给我定义Applicativeclass Functor a => Applicative a为强迫你加入一个Functor实例,然后才能添加Applicative之一,然而,你可以写一个实例声明一样instance Applicative a => Functor a,将确保每一个Applicative也是Functor

这个方法背后的原因是什么?而且,正如我所说,如果超类可以使用子类实例化,是否一个规则是一个类型类是另一个类的超类?

+1

我会说这不是一个规则。 'class Num a =>小数a'',但不能用'Fractional'的少数几个方法来定义'+'(在'Num'中)。话虽如此,如果我们能写出例如一个'实例Monad'并具有'Applicative,Functor'自动定义而不需要样板代码。或者,更好的是,用一些通用的机制把它们交给任意的类层次结构。 – chi

回答

2

这不是一个子类,而是一个类限制。在类声明中,这通常表示默认的多态操作使用该类型类的多态操作,尽管这是一个例外。

这里,这并不重要,因为它只是强加的限制,但它确实意味着,作为一个Applicatve实例意味着一个对象也是一个Functor情况下,允许<$>无忧使用。我们还会如何操作其中的值?

请记住,Haskell的典型性只是描述多态值的方式:它与面向对象的结构相当,不是而是

Control.Applicative的来源可以找到here,如果你想看看实际的声明。