Récemment, j'ai épousseté mes connaissances sur le fonctionnement des Monades. J'ai également été initié au concept de 'Comonad' , qui est décrit comme le dual inverse d'une monade . Cependant, je suis impossible d'envelopper ma tête autour d'elle.
Pour comprendre les Monades, je me suis fait l'analogie:
Les monades peuvent être considérées comme «un modèle pour construire des bandes transporteuses d'expressions».
Pour définir une nouvelle Monade (un nouveau type de système de convoyeur à bande), vous devez définir:
- Un moyen de mettre quelque chose sur un tapis roulant, par exemple «démarrer» un tapis roulant. (Connu comme
unit
oureturn
)- Un moyen de connecter une machine (une expression) qui fera partie d'un tapis roulant à un tapis roulant. (Connu comme
join
oubind
ou>>=
).(Il y a une troisième opération qui prend le tapis roulant actuel, jette son contenu et démarre un nouveau tapis roulant appelé
>>
, mais il est utilisé très rarement.)Pour que les machines et les convoyeurs fonctionnent correctement ensemble, vous devez vous assurer que:
- Si vous placez quelque chose sur un tapis roulant et le passez dans une machine, la sortie doit être la même que lorsque vous la passez manuellement dans la machine. (Identité de gauche)
- Si vous voulez placer une bande transporteuse entre une bande transporteuse déjà existante, vous ne devriez pas vous retrouver avec une bande transporteuse qui a une bande transporteuse sur le dessus, mais plutôt une bande transporteuse unique et plus longue. (Bonne identité)
- Cela ne devrait pas avoir d'importance pour la sortie si vous utilisez manuellement la machine A, puis passez le résultat via le BC connecté au convoyeur, ou si vous utilisez AB connecté au convoyeur et passez ensuite le résultat manuellement via C.En d'autres termes: ((a >> = b) >> = c) doit être identique à (a >> = (b >> = c)) (associativité)
La bande transporteuse la plus simple serait celle qui prend juste l'entrée et continue toujours à l'expression suivante. Voilà ce qu'est un «pipeline».
Une autre possibilité consiste à ne laisser passer la machine suivante que si une condition est remplie pour la valeur. Cela signifie que si au niveau de certaines expressions intermédiaires, la valeur devient quelque chose qui n'est plus autorisé, le reste des expressions sera ignoré. C'est ce que fait la monade «Peut-être» à Haskell.
Vous pouvez également effectuer d'autres règles de copie / modification conditionnelles de fantaisie sur les valeurs avant ou après leur transmission à une machine. Un exemple: analyseurs (ici, si une expression renvoie un résultat «échec», la valeur d' avant l'expression est utilisée en sortie).
Bien sûr, l'analogie n'est pas parfaite, mais j'espère qu'elle donne une bonne représentation du fonctionnement des monades.
Cependant, j'ai beaucoup de mal à renverser cette analogie pour comprendre les Comonads. Je sais d'après les petites quantités d'informations que j'ai trouvées sur Internet qu'un Comonad définit:
extract
, Qui est en quelque sorte l'inverse dereturn
, qui est, il faut une valeur hors d'un Comonad.duplicate
, qui est en quelque sorte l'inverse dejoin
, c'est-à-dire qu'il crée deux Comonades à partir d'une seule.
Mais comment une Comonad peut-elle être instanciée si nous ne pouvons en extraire ou les dupliquer? Et comment peuvent-ils réellement être utilisés? J'ai vu ce projet très étonnant et les discussions à ce sujet (que j'ai malheureusement très peu compris), mais je ne sais pas exactement quelle partie des fonctionnalités est fournie par une Comonad.
Qu'est-ce qu'une Comonad? À quoi servent-ils? Comment peuvent-ils être utilisés? Sont-ils comestibles?
IO
monade est le système d'exécution Haskell, qui invoque main
. Il y a aussi unsafePerformIO
, bien sûr. Si vous voulez considérer la Maybe
monade comme ayant une «machine au bout du tapis roulant», vous pouvez l'utiliser maybe
.
cobind
applications, il doit y avoir une fonction qui fait quelque chose d'utile avec la représentation interne de votre comonad.