Liens entre classes Monad, Functor, etc.
Une question que je me pose depuis un moment déjà :
D'après ce que j'ai compris, toute Monad est un Applicative, de même que tout Applicative est un Functor, et tout Functor est une Arrow.
Arrêtez-moi si je me trompe, mais si j'ai raison, dans ce cas est-ce que, lorsqu'on défini un type comme étant une instance de Monad, l'instanciation de Functor, Applicative et Arrow se fait automatiquement ?
Pour la généralisation Monad => Functor, pour moi on peut faire :
Code:
1 2
| instance Monad m => Functor m where
fmap f x = x >>= return . f |
De même, on peut généraliser les Applicatives aux functors avec:
Code:
1 2
| instance Applicative f => Functor f where
fmap f app = pure f <*> app |
Et pour finir, généraliser les Monads aux Applicatives :
Code:
1 2 3
| instance Monad m => Applicative m where
pure x = return x
f <*> x = f >>= (\fct -> x >>= return . fct) |
Pour la généralisation aux Arrows, là je sais pas, je ne les ai pas encore utilisées.
Si cela est aussi simple, alors Haskell le fait-il automatiquement ?