Memahami mengapa Zipper adalah Comonad

112

Ini merupakan tindak lanjut dari jawaban atas pertanyaan saya sebelumnya.

Misalkan saya perlu untuk memetakan setiap item a:Adari List[A]untuk b:Bdengan fungsi def f(a:A, leftNeighbors:List[A]): Bdan menghasilkan List[B].

Jelas saya tidak bisa begitu saja memanggil mapdaftar tetapi saya bisa menggunakan daftar ritsleting . Ritsleting adalah kursor untuk bergerak di sekitar daftar. Ini menyediakan akses ke elemen saat ini ( focus) dan tetangganya.

Sekarang saya bisa mengganti fdengan saya def f'(z:Zipper[A]):B = f(z.focus, z.left)dan meneruskan fungsi baru ini f'ke cobindmetode Zipper[A].

Cara cobindkerjanya seperti ini: ia menyebutnya f'dengan ritsleting, lalu memindahkan ritsleting, memanggil f'dengan ritsleting baru yang "dipindahkan", memindahkan ritsleting lagi dan seterusnya, dan seterusnya ... hingga ritsleting mencapai akhir daftar.

Akhirnya, cobindmengembalikan jenis ritsleting baru Zipper[B], yang dapat diubah ke daftar dan masalah terpecahkan.

Sekarang perhatikan simetri antara cobind[A](f:Zipper[A] => B):Zipper[B]dan bind[A](f:A => List[B]):List[B]Itu sebabnya Listadalah a Monaddan Zipperadalah a Comonad.

Apakah masuk akal ?

Michael
sumber
1
Saya bukan seorang ahli, tapi itu masuk akal bagi saya. Saya mendapat pencerahan saat membaca penjelasan Anda. Terima kasih!
acjay
7
Pertanyaan Anda sangat sulit dijawab dalam format SO ... tetapi Anda benar sekali. Ritsleting yang berfokus pada elemen selalu merupakan comonad.
J. Abrahamson
4
List juga dapat dilihat sebagai comonad (dalam berbagai cara), sedangkan Zipper dapat ditampilkan sebagai monad (juga dalam banyak cara). Perbedaannya adalah apakah Anda secara konseptual berfokus pada "menambahkan" data secara konstruktif ke mesin status (itulah inti dari antarmuka Monad), atau "mengekstrak" status darinya "secara dekonstruktif" (itulah yang dilakukan Comonad). Tidaklah mudah untuk menjawab pertanyaan yang dinyatakan sebagai "apakah pemahaman ini masuk akal". Dalam beberapa hal memang demikian, di sisi lain tidak.
KT.
2
Untuk mentransmisikan sesuatu menjadi comonad Anda perlu menyediakan dua operasi: 1) Ekstraksi nilai (misalnya bisa menjadi kepala daftar) dan 2) Penerapan operasi pemrosesan daftar (misalnya Anda dapat menerapkannya dalam geser- window way sepanjang daftar atau dengan cara elemen-bijaksana atau sejenisnya, dengan asumsi transformasi unit yang sesuai tidak akan mengubah daftar). Apakah cara pemrosesan daftar seperti itu masuk akal adalah masalah yang terpisah. Perhatikan bahwa antarmuka bare comonad tidak menyediakan cara untuk membuat daftar atau melewatinya. Ia hanya tahu bagaimana menggunakan operasi sadar-daftar.
KT.
2
@eenblam Anda benar. Saya akan menambahkan jawaban dan itu akan mengeluarkan pertanyaan ini dari daftar yang tidak terjawab, saya harap
Michael

Jawaban:

1

Karena pertanyaan ini sering muncul di bagian atas daftar "tak terjawab", izinkan saya menyalin komentar saya sebagai jawaban di sini - tidak ada yang lebih konstruktif yang muncul sejak setahun yang lalu.

A Listjuga dapat dilihat sebagai comonad (dalam berbagai cara), sedangkan a Zipperdapat ditampilkan sebagai monad (juga dalam banyak cara). Perbedaannya adalah apakah Anda secara konseptual berfokus pada "menambahkan" data secara konstruktif ke mesin status (itulah Monadintinya), atau "mengekstrak" status darinya "secara dekonstruktif" (itulah yang Comonaddilakukannya).

Tidaklah mudah untuk menjawab pertanyaan yang dinyatakan sebagai "apakah pemahaman ini masuk akal". Dalam beberapa hal memang demikian, di sisi lain tidak.

KT.
sumber