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 :
De même, on peut généraliser les Applicatives aux functors avec:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 instance Monad m => Functor m where fmap f x = x >>= return . f
Et pour finir, généraliser les Monads aux Applicatives :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 instance Applicative f => Functor f where fmap f app = pure f <*> app
Pour la généralisation aux Arrows, là je sais pas, je ne les ai pas encore utilisées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 instance Monad m => Applicative m where pure x = return x f <*> x = f >>= (\fct -> x >>= return . fct)
Si cela est aussi simple, alors Haskell le fait-il automatiquement ?
Partager