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.
[^] # Re: Sympa ton journal
Posté par kantien . En réponse au journal Des vieilles bases d'unix à la hype reactive actuelle. Évalué à 4.
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).Là j'ai trois types A, B et C et deux fonctions
f : A -> Betg : 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) : appliquegau résultat def; ou en mode inverse : passe le résultat defà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 (fpuisg).Après une monade, c'est un type paramétrique (ici
Fsur le dessin) avec certaines bonnes propriétés. Tout d'abord on doit pouvoir faire unmapdessus : à partir def : A -> B, on peut construiremap 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 autreB -> F(C): ce sont les diagonales que l'on cherche à assembler. Mais pour ce faire, on utilise plutôt l'opérateurbind(ou>>=en notation infixe) qui prend une valeur de typeF(A), une fonction de typeA -> F(B)et renvoie une valeur de typeF(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.Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.