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 ?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top