Dies ist eine Fortsetzung der Antwort auf meine vorherige Frage.
Angenommen , ich brauche jedes Element zur Karte a:Avon List[A]zu b:Bmit Funktion def f(a:A, leftNeighbors:List[A]): Bund erzeugen List[B].
Natürlich kann ich nicht einfach anrufen mapauf 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 fdurch ersetzen def f'(z:Zipper[A]):B = f(z.focus, z.left)und diese neue Funktion f'an die cobindMethode von übergeben Zipper[A].
Das cobindfunktioniert so: Es ruft das f'mit dem Reißverschluss auf, bewegt dann den Reißverschluss, ruft f'mit dem neuen "verschobenen" Reißverschluss auf, bewegt den Reißverschluss wieder und so weiter und so fort ... bis der Reißverschluss das Ende der Liste erreicht.
Schließlich wird cobindein neuer Reißverschluss vom Typ zurückgegeben Zipper[B], der in die Liste umgewandelt werden kann, sodass 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 Listist a Monadund Zipperist a Comonad.
Macht das Sinn ?