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
可以看到Monad是Applicative的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
我们看到Applicative是Functor的extension class。
因此,Applicative扩展了Functor,Monad扩展了Applicative。因此Monad继承了Functor和Applicative的所有方法。
这里还是要强调下,Haskell里面的class不要和面向对象语言里面的class相提并论。