Capire perché Zipper è un Comonad


112

Questo è un seguito alla risposta alla mia domanda precedente.

Supponiamo di dover mappare ogni elemento a:Adi List[A]a b:Bcon la funzione def f(a:A, leftNeighbors:List[A]): Be generare List[B].

Ovviamente non posso semplicemente chiamare mapsulla lista ma posso usare la cerniera della lista . La cerniera è un cursore per spostarsi in un elenco. Fornisce accesso all'elemento corrente ( focus) e ai suoi vicini.

Ora posso sostituire my fcon def f'(z:Zipper[A]):B = f(z.focus, z.left)e passare questa nuova funzione f'al cobindmetodo di Zipper[A].

Le cobindopere come questa: si chiama che f'con la cerniera, poi si sposta la cerniera, le chiamate f'con la nuova "mosso" cerniera, muove la cerniera di nuovo e così via, e così via ... fino a quando la cerniera raggiunge la fine della lista.

Infine, cobindrestituisce una nuova cerniera di tipo Zipper[B], che può essere trasformata in lista e così il problema è risolto.

Ora nota la simmetria tra cobind[A](f:Zipper[A] => B):Zipper[B]e bind[A](f:A => List[B]):List[B]Ecco perché Listè a Monaded Zipperè a Comonad.

Ha senso ?


1
Non sono un esperto, ma per me ha senso. Ho avuto un'illuminazione leggendo la tua spiegazione. Grazie!
acjay

7
È molto difficile rispondere alla tua domanda nel formato SO ... ma hai assolutamente ragione. Le cerniere incentrate sugli elementi sono sempre comonad.
J. Abrahamson

4
La lista può essere vista anche come una comonade (in più modi), mentre una Zipper può essere lanciata come una monade (anche in molti modi). La differenza sta nel fatto che ti concentri concettualmente sull '"aggiunta" di dati in modo costruttivo a una macchina a stati (questo è ciò di cui parla l'interfaccia Monad), o "estraendo" lo stato da essa "decostruttivamente" (questo è ciò che fa Comonad). Non è facile rispondere alla domanda, affermata come "questa comprensione ha un senso", tuttavia. In un certo senso lo fa, in un altro no.
KT.

2
Per lanciare qualcosa in una comonad devi fornire due operazioni: 1) Estrazione di un valore (ad esempio potrebbe essere l'inizio della lista) e 2) Applicazione di un'operazione di elaborazione di lista (ad esempio potresti applicarla in finestra lungo l'elenco o in un modo saggio di elementi o simile, assumendo che una trasformazione di unità appropriata non cambierà l'elenco). Se un tale modo di elaborare un elenco abbia un senso è una questione a parte. Si noti che una semplice interfaccia comonad non fornisce né un modo per costruire l'elenco né per attraversarlo. Sa solo come utilizzare le operazioni che riconoscono l'elenco.
KT.

2
@eenblam Hai ragione. Aggiungerò una risposta e spero che questa domanda rimanga fuori dall'elenco senza risposta
Michael

Risposte:


1

Poiché questa domanda appare regolarmente in cima alla lista "senza risposta", lasciatemi copiare il mio commento come risposta qui - comunque da un anno fa non è apparso nulla di considerevolmente più costruttivo.

A Listpuò essere visto altrettanto bene come una comonade (in più modi), mentre a Zipperpuò essere lanciato come una monade (anche in molti modi). La differenza sta nel fatto che tu sia concettualmente concentrato su "aggiungere" dati in modo costruttivo a una macchina a stati (questo è ciò di cui Monadparla l' interfaccia), o "estrarre" lo stato da essa in modo "decostruttivo" (ecco cosa Comonadfa).

Non è facile rispondere alla domanda, affermata come "questa comprensione ha un senso", tuttavia. In un certo senso lo fa, in un altro no.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.