Ceci fait suite à la réponse à ma question précédente.
Supposons que je doive mapper chaque élément a:A
de List[A]
à b:B
avec une fonction def f(a:A, leftNeighbors:List[A]): B
et générer List[B]
.
Évidemment, je ne peux pas simplement appeler map
sur la liste, mais je peux utiliser la fermeture à glissière de la liste . La fermeture éclair est un curseur pour se déplacer dans une liste. Il donne accès à l'élément courant ( focus
) et à ses voisins.
Maintenant, je peux remplacer mon f
par def f'(z:Zipper[A]):B = f(z.focus, z.left)
et passer cette nouvelle fonction f'
à la cobind
méthode de Zipper[A]
.
Les cobind
œuvres comme celle - ci: il appelle que f'
la fermeture à glissière, puis déplace la fermeture, les appels f'
à la nouvelle « émeut » fermeture éclair, se déplace à nouveau la fermeture éclair et ainsi de suite, et ainsi de suite ... jusqu'à ce que la fermeture à glissière atteint la fin de la liste.
Enfin, le cobind
renvoie une nouvelle fermeture éclair de type Zipper[B]
, qui peut être transformée en liste et ainsi le problème est résolu.
Notez maintenant la symétrie entre cobind[A](f:Zipper[A] => B):Zipper[B]
et bind[A](f:A => List[B]):List[B]
C'est pourquoi List
est a Monad
et Zipper
est a Comonad
.
Est-ce que ça fait du sens ?
Réponses:
Comme cette question apparaît régulièrement en haut de la liste des "sans réponse", permettez-moi de copier mon commentaire comme réponse ici - rien de beaucoup plus constructif n'est apparu depuis il y a un an de toute façon.
A
List
peut également être considéré comme une comonade (de plusieurs manières), tandis que aZipper
peut être jeté comme une monade (également de plusieurs manières). La différence réside dans le fait que vous vous concentrez conceptuellement sur «ajouter» des données de manière constructive à une machine à états (c'est ce dontMonad
parle l' interface), ou «en extraire» l'état de manière «déconstructive» (c'est ce queComonad
fait).Il n'est cependant pas facile de répondre à la question posée par «cette compréhension a-t-elle un sens». Dans un certain sens, oui, dans un autre, non.
la source