En La théorie des catégories pour les programmeurs par Bartosz Milewski, Milewski écrit le code suivant pour définir le retour et l'opérateur "poisson" (composition dans la catégorie de Kleisli) pour la monade Writer.
return :: a -> Writer a
return x = (x, "")
(>=>) :: (a -> Writer b) -> (b -> Writer c) -> (a -> Writer c)
m1 >=> m2 = \x ->
let (y, s1) = m1 x
(z, s2) = m2 y
in (z, s1 ++ s2)
Il définit ensuite fmap
comme suit :
fmap f = id >=> (\x -> return (f x))
J'ai des difficultés à comprendre comment le id
est utilisée ici. Le premier argument de l'opérateur poisson est clairement (a -> Writer b)
mais id a la signature de type a -> a
.
S'agit-il d'une erreur ou d'une faille dans ma compréhension ? Remplacement de id
avec return
est plus logique pour moi.