Haskell:Class Extension

在Haskell当中,class支持extension的概念,就是一个class可以扩展另一个class,比如:

Prelude> :info Ord
class Eq a => Ord a where
  compare :: a -> a -> Ordering
  (<) :: a -> a -> Bool
  (<=) :: a -> a -> Bool
  (>) :: a -> a -> Bool
  (>=) :: a -> a -> Bool
  max :: a -> a -> a
  min :: a -> a -> a

注意上面的语法:

class Eq a => Ord a ...

我们看到,Ord这个class就是Eq class的扩展。因此Eq就是Ord的superclass。

这样,Ord class就继承(inherit)了所有Eq里面定义的方法。因此Ord class就可以使用Eq class中的=/方法来定义自己的<方法:

x < y =  x <= y && x /= y

我们接下来要讲的Monad,我们可以看看它的info:

Prelude> :info Monad
class Applicative m => Monad (m :: * -> *) where
  (>>=) :: m a -> (a -> m b) -> m b
  (>>) :: m a -> m b -> m b
  return :: a -> m a
  fail :: String -> m a

可以看到MonadApplicative的extension class。接下来我们看看Applicative

Prelude> :info Applicative
class Functor f => Applicative (f :: * -> *) where
  pure :: a -> f a
  (<*>) :: f (a -> b) -> f a -> f b
  (*>) :: f a -> f b -> f b
  (<*) :: f a -> f b -> f a

我们看到ApplicativeFunctor的extension class。

因此,Applicative扩展了FunctorMonad扩展了Applicative。因此Monad继承了Functor和Applicative的所有方法。

这里还是要强调下,Haskell里面的class不要和面向对象语言里面的class相提并论。