Zrozumienie, dlaczego Zipper jest Comonad

112

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 ?

Michael
źródło
1
Nie jestem ekspertem, ale to ma dla mnie sens. Czytając twoje wyjaśnienie, doznałem objawienia. Dzięki!
acjay
7
Bardzo trudno odpowiedzieć na Twoje pytanie w formacie SO ... ale masz całkowitą rację. Zamki błyskawiczne skupione na elementach są zawsze comonadami.
J. Abrahamson
4
Listę można również postrzegać jako comonadę (na wiele sposobów), podczas gdy Zipper można rzucić jako monadę (również na wiele sposobów). Różnica polega na tym, czy koncepcyjnie koncentrujesz się na „dodawaniu” danych konstruktywnie do automatu stanowego (o to chodzi w interfejsie Monad), czy na „wydobywaniu” z niego stanu „dekonstrukcyjnie” (to właśnie robi Comonad). Nie jest jednak łatwo odpowiedzieć na pytanie, sformułowane jako „czy to rozumienie ma sens”. W pewnym sensie tak, w innym nie.
KT.
2
Aby rzucić coś na komonadę, musisz podać dwie operacje: 1) Wyodrębnienie wartości (np. Może to być nagłówek listy) i 2) Zastosowanie operacji przetwarzania listy (np. Można ją zastosować w okna wzdłuż listy lub w sposób elementarny lub podobny, przy założeniu, że odpowiednia transformacja jednostek nie zmieni listy). To, czy taki sposób przetwarzania listy ma sens, to osobna kwestia. Zauważ, że czysty interfejs Comonad nie zapewnia możliwości tworzenia listy ani jej przeglądania. Wie tylko, jak korzystać z operacji obsługujących listy.
KT.
2
@eenblam Masz rację. Dodam odpowiedź i to usunie to pytanie z listy bez odpowiedzi, mam nadzieję
Michael

Odpowiedzi:

1

Ponieważ to pytanie regularnie pojawia się na szczycie listy „bez odpowiedzi”, pozwolę sobie tylko skopiować mój komentarz jako odpowiedź - i tak nic bardziej konstruktywnego nie pojawiło się od roku.

ZA List może być również postrzegana jako komonada (na wiele sposobów), podczas gdy a Zippermoże być rzucana jako monada (również na wiele sposobów). Różnica polega na tym, czy koncepcyjnie koncentrujesz się na „dodawaniu” danych konstruktywnie do automatu stanowego (o to chodzi w Monadinterfejsie), czy na „wydobywaniu” z nich stanu „dekonstrukcyjnie” (to właśnie Comonadrobi).

Nie jest jednak łatwo odpowiedzieć na pytanie, sformułowane jako „czy to rozumienie ma sens”. W pewnym sensie tak, w innym nie.

KT.
źródło