• [^] # Re: Sympa ton journal

    Posté par . En réponse au journal Des vieilles bases d'unix à la hype reactive actuelle. Évalué à 4.

    Tu penses (probablement) à une monade spécifique qui fait de la composition de fonctions.

    Bah, c'est la monade identité, qui n'est pas spécialement la plus utile.

    Par contre, je comprends pas trop où veut en venir Michaël : avec les monades et leur bind, on les utilise plutôt dans le sens inverse de la composition (à la manière du pipe du shell).

     f g
     A -----------> B -----------> C
     | | |
     | | |
     V map f V map g V
    F(A) -----------> F(B) -----------> F(C)
    

    Là j'ai trois types A, B et C et deux fonctions f : A -> B et g : B -> C. Si je les compose, j'obtiens une fonction de A vers C. On peut le dire en mode direct (à la mode mathématique) : applique g au résultat de f; ou en mode inverse : passe le résultat de f à g. La conception à la manière d'une pipeline, c'est de le voire comme sur le dessin en mode inverse : on écrit les traitements dans l'ordre où ils sont effectués (f puis g).

    Après une monade, c'est un type paramétrique (ici F sur le dessin) avec certaines bonnes propriétés. Tout d'abord on doit pouvoir faire un map dessus : à partir de f : A -> B, on peut construire map f : F(A) -> F(B) qui respecte la composition. Si je compose f et g, puis que j'applique map, ou que j'applique map puis que je compose, on doit obtenir le même résultat.

    Ensuite, pour que ce type paramétrique soit une monade, il faut pouvoir combiner une fonction A -> F(B) avec un autre B -> F(C) : ce sont les diagonales que l'on cherche à assembler. Mais pour ce faire, on utilise plutôt l'opérateur bind (ou >>= en notation infixe) qui prend une valeur de type F(A), une fonction de type A -> F(B) et renvoie une valeur de type F(B). C'est l'équivalent du pipe pour les monades : le pipe est à la composition de fonctions, ce que le bind est à la composition d'opérateurs monadiques.

    (* on va de A vers C en composant f et g *)
    x |> f |> g
    (* 
     on va de F(A) vers F(C) via la monade
     f' et g' sont les fonctions en diagonales
    *)
    mx >>= f' >>= g'

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.