Comprendre pourquoi Zipper est un Comonad

112

Ceci fait suite à la réponse à ma question précédente.

Supposons que je doive mapper chaque élément a:Ade List[A]à b:Bavec une fonction def f(a:A, leftNeighbors:List[A]): Bet générer List[B].

Évidemment, je ne peux pas simplement appeler mapsur 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 fpar def f'(z:Zipper[A]):B = f(z.focus, z.left)et passer cette nouvelle fonction f'à la cobindmé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 cobindrenvoie 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 Listest a Monadet Zipperest a Comonad.

Est-ce que ça fait du sens ?

Michael
la source
1
Je ne suis pas un expert, mais cela a du sens pour moi. J'ai eu une révélation en lisant votre explication. Merci!
acjay
7
Il est très difficile de répondre à votre question dans le format SO ... mais vous avez tout à fait raison. Les fermetures éclair axées sur les éléments sont toujours comonads.
J. Abrahamson
4
La liste peut également être considérée comme une comonade (de plusieurs manières), tandis qu'une fermeture à glissière peut être lancée 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 dont parle l'interface Monad), ou «en extraire» l'état de manière «déconstructive» (c'est ce que fait le Comonad). 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.
KT.
2
Pour lancer quelque chose dans un comonad, vous devez fournir deux opérations: 1) Extraction d'une valeur (par exemple, cela pourrait être la tête de la liste) et 2) Application d'une opération de traitement de liste (par exemple, vous pouvez l'appliquer dans un glissement- fenêtre le long de la liste ou d'une manière élémentaire ou similaire, en supposant qu'une transformation d'unité appropriée ne changera pas la liste). La question de savoir si une telle manière de traiter une liste a du sens est une question distincte. Notez qu'une interface simple de comonad ne fournit ni un moyen de construire la liste ni de la parcourir. Il sait uniquement comment utiliser des opérations prenant en charge les listes.
KT.
2
@eenblam Vous avez raison. J'ajouterai une réponse et cela retirera cette question de la liste sans réponse, j'espère
Michael

Réponses:

1

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 Listpeut également être considéré comme une comonade (de plusieurs manières), tandis que a Zipperpeut ê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 dont Monadparle l' interface), ou «en extraire» l'état de manière «déconstructive» (c'est ce que Comonadfait).

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.

KT.
la source