To jest kontynuacja odpowiedzi na moje poprzednie pytanie.
Załóżmy, że trzeba mapować każdy element a:Aod List[A]do b:Bz funkcji def f(a:A, leftNeighbors:List[A]): Bi generować List[B].
Oczywiście nie mogę po prostu zadzwonić mapna listę, ale mogę użyć suwaka listy . Zamek błyskawiczny to kursor do poruszania się po liście. Zapewnia dostęp do bieżącego elementu ( focus) i jego sąsiadów.
Teraz mogę zastąpić mój fz def f'(z:Zipper[A]):B = f(z.focus, z.left)i przekazać tę nową funkcję f'do cobindmetody Zipper[A].
Że cobinddziała tak: to połączenia, które f'z zamkiem, a następnie przesuwa suwak, rozmowy f'z nowym „przeniesione” na zamek błyskawiczny, znowu i tak dalej, i tak porusza się na zamek błyskawiczny ... aż osiągnie koniec listy.
Na koniec cobindzwraca nowy typ zamka błyskawicznego Zipper[B], który można przekształcić na listę, dzięki czemu problem został rozwiązany.
Zwróć teraz uwagę na symetrię między cobind[A](f:Zipper[A] => B):Zipper[B]a bind[A](f:A => List[B]):List[B]Dlatego Listjest a Monadi Zipperjest a Comonad.
Czy jest sens ?