J'ai écrit un code monadique en utilisant un monade de lecteur et je me demande s'il y a une façon d'écrire en utilisant le do notation:Sugaring Code monadique du lecteur monade
m = Map.fromList [("This","is"), ("is","the"), ("the","secret")]
f x m = fromMaybe "default" $ Map.lookup x m
r :: String -> Reader (Map String String) String)
r x = reader $ \m1 -> f x m1
runReader ((r "This") >>= r >>= r) m
-- "secret"
Maintenant, comment voulez-vous écrire la dernière déclaration faire la notation.
J'ai le sentiment que tous les « monades élargies » à l'aide runX
fonctions ne prêtent pas vraiment à faire la notation.
'runReader (do {s1 <- r "Ce", s2 <- r s1; r s2}) m'-t-il. Bien que pour ce genre de choses, vous soyez probablement plus intéressé par l'opérateur '> =>' et newtype 'Kleisli'. Par exemple, 'runReader ((r> => r> => r)" This ") m' fait la même chose. – Alec