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相提并论。