Verstehen, warum Zipper ein Comonad ist
-
21-12-2019 - |
Frage
Dies ist eine Fortsetzung des Antwort zu meiner vorherigen Frage.
Angenommen, ich muss jedes Element zuordnen a:A
von List[A]
Zu b:B
mit Funktion def f(a:A, leftNeighbors:List[A]): B
und erzeugen List[B]
.
Natürlich kann ich nicht einfach anrufen map
auf der Liste, aber ich kann die Liste verwenden Reißverschluss.Der Reißverschluss ist ein Cursor zum Bewegen in einer Liste.Es bietet Zugriff auf das aktuelle Element (focus
) und seine Nachbarn.
Jetzt kann ich meine ersetzen f
mit def f'(z:Zipper[A]):B = f(z.focus, z.left)
und übergeben Sie diese neue Funktion f'
Zu cobind
Methode von Zipper[A]
.
Der cobind
funktioniert so:es nennt sich so f'
mit dem Reißverschluss, dann bewegt er den Reißverschluss, ruftf'
mit dem neu Reißverschluss „bewegt“, Reißverschluss erneut verschoben und so weiter, und so weiter ...bis der Reißverschluss das Ende der Liste erreicht.
Endlich, das cobind
Gibt einen neuen Reißverschluss vom Typ zurück Zipper[B]
, die in die Liste umgewandelt werden kann und so das Problem gelöst ist.
Beachten Sie nun die Symmetrie zwischen cobind[A](f:Zipper[A] => B):Zipper[B]
Und bind[A](f:A => List[B]):List[B]
Deshalb List
ist ein Monad
Und Zipper
ist ein Comonad
.
Macht das Sinn ?
Lösung
Da diese Frage regelmäßig ganz oben auf der Liste der „unbeantworteten“ Fragen steht, kopiere ich einfach meinen Kommentar als Antwort hierher – seit einem Jahr ist sowieso nichts wesentlich Konstruktiveres erschienen.
A List
kann genauso gut (auf verschiedene Arten) als Komonade angesehen werden, während a Zipper
kann als Monade gegossen werden (auch auf viele Arten).Der Unterschied besteht darin, ob Sie sich konzeptionell darauf konzentrieren, Daten konstruktiv an eine Zustandsmaschine anzuhängen (das ist es, was die Monad
Schnittstelle) oder das „Extrahieren“ des Zustands daraus „dekonstruktiv“ (darum geht es bei der Schnittstelle). Comonad
tut).
Es ist jedoch nicht einfach, die Frage zu beantworten, die lautet: „Macht dieses Verständnis Sinn?“In gewissem Sinne ist das der Fall, in einem anderen nicht.