class Applicative m > Monad m where (>>) :: (a -> m b) -> m b

class Functor w => Comonad w where extract :: w a -> a extend :: (w a -> b) -> w a -> w b

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

class Functor f where fmap :: (a -> b) -> f a -> f b