En théorie des catégories, une monade peut être construite à partir de deux foncteurs adjoints. En particulier, si C et D sont des catégories et F : C --> D et G : D --> C sont des foncteurs adjoints, dans le sens où il existe une bijection
hom(FX,Y) = hom(X,GY)
pour chaque X sur C et Y sur D alors la composition G o F : C --> C est une monade.
Une telle paire de foncteurs adjoints peut être donnée en fixant un type b
et en prenant F
et G
à être
data F b a = F (a,b)
data G b a = G (b -> a)
instance Functor (F b) where
fmap f (F (a,b)) = F (f a, b)
instance Functor (G b) where
fmap f (G g) = G (f . g)
et la bijection entre hom-ensembles est donnée (modulo les constructeurs) par la curie :
iso1 :: (F b a -> c) -> a -> G b c
iso1 f = \a -> G $ \b -> f (F (a,b))
iso2 :: (a -> G b c) -> F b a -> c
iso2 g = \(F (a,b)) -> let (G g') = g a in g' b
auquel cas la monade correspondante est
data M b a = M { unM :: b -> (a,b) }
instance Monad (M b) where
return a = M (\b -> (a,b))
(M f) >>= g = M (\r -> let (a,r') = f r in unM (g r') a)
Je ne sais pas quel devrait être le nom de cette monade, si ce n'est qu'elle semble être quelque chose comme une monade de lecture qui transporte un élément d'information réinscriptible ( éditer : dbaupp fait remarquer dans les commentaires qu'il s'agit de la State
monade).
Ainsi, le State
peut être "décomposée" comme une paire de foncteurs adjoints F
et G
et nous pourrions écrire
State = G . F
Jusqu'à présent, tout va bien.
J'essaie maintenant de trouver comment décomposer d'autres monades communes en paires de foncteurs adjoints, par exemple Maybe
, []
, Reader
, Writer
, Cont
- mais je n'arrive pas à comprendre en quoi consistent les paires de foncteurs adjoints dans lesquelles nous pouvons les "décomposer".
Le seul cas simple semble être le Identity
qui peut être décomposée en une paire quelconque de foncteurs F
et G
de telle sorte que F
est l'inverse de G
(en particulier, vous pourriez simplement prendre F = Identity
et G = Identity
).
Quelqu'un peut-il m'éclairer ?