Apa kelas tipe Comonad di Haskell?

105

Apa kelas tipe Comonad di Haskell? Seperti dalam Comonad dari Control.Comonad dalam paket comonad (penjelasan tentang paket lain yang menyediakan kelas tipe Comonad juga diterima). Saya samar-samar pernah mendengar tentang Comonad, tetapi yang saya benar-benar tahu tentang itu adalah penyediaan extract :: w a -> a, semacam paralel dengan Monad return :: a -> m a.

Poin bonus untuk mencatat penggunaan Comonad dalam "kehidupan nyata" dalam kode "nyata".

Dan Burton
sumber
Saya sangat ingin melihat apa perbedaan antara "co" dan normal. Saya tahu apa itu monad. Jadi jika saya tahu apa artinya "co", saya bisa menyimpulkan sendiri, apa itu comonad, dan memahaminya secara mendalam. Jawaban Alexey Romanov tidak berpengaruh dalam aspek itu.
Evi1M4chine
2
@ Evi1M4chine: "co" (longgar) berarti "membalikkan panah". Berikut adalah gambaran kasarnya. Pertimbangkan operasi monadik: return :: a ~> m a, flip bind :: (a ~> m b) -> (m a ~> m b). Membalikkan berlekuk-lekuk panah dan Anda mendapatkan operasi comonadic: extract :: a <~ w a, extend :: (a <~ w b) -> (w a <~ w b)( extract :: w a -> a, extend :: (w a -> b) -> w a -> w b)
Dan Burton
Terima kasih @Dan Burton… jadi sementara dengan monad, Anda bekerja di "dalam" (memasukkan hal-hal baru dan yang diubah ke dalam), dengan comonad, Anda bekerja di "luar" (akhirnya mengeluarkan atau hanya mengubahnya) . Apakah pandangan itu benar? Karena itu pasti banyak membantu dengan pemahaman yang mendalam.
Evi1M4chine
comonads dapat digunakan untuk memodelkan efek bersama. Berikut adalah pengantar yang bagus untuk coeffects: tomasp.net/coeffects
zeronone

Jawaban:

83

Tautan ini mungkin berguna:

  1. Mengevaluasi automata seluler bersifat komonadik . Secara khusus, "setiap kali Anda melihat struktur data besar disatukan dari banyak komputasi kecil tapi serupa, ada kemungkinan bagus bahwa kita berurusan dengan comonad".
  2. Urutan, aliran, dan segmen
  3. Comonads dalam kehidupan sehari-hari
Alexey Romanov
sumber
1
+1 Tautan pertama adalah yang benar-benar menyatukannya bagi saya.
luqui
42
Jawaban link-saja setidaknya harus berisi ringkasan dari konten terkait. Saat ini jawaban ini tidak cocok untuk menjadi jawaban SO yang baik. Pertimbangkan untuk mengembangkannya sedikit, sehingga dapat berdiri sendiri tanpa artikel yang ditautkan.
Bakuriu
3
"setiap kali Anda melihat struktur data besar disatukan dari banyak komputasi kecil tetapi serupa, ada kemungkinan besar kita berurusan dengan comonad" .... Jadi, apakah itu berarti shader fragmen adalah comonadic?
Sam Kellett
Saya menemukan contoh ini dari extenduntuk membantu.
Chris Penner
22

Ini tidak sepenuhnya menjawab pertanyaan saya, tetapi saya ingin memberikan beberapa informasi yang relevan dalam format jawaban:

"co" (secara longgar) berarti "membalikkan panah". Berikut adalah gambaran kasarnya.

Pertimbangkan operasi monadik:

return :: a ~> m a
flip (>>=) :: (a ~> m b) -> (m a ~> m b)

Balikkan panah berlekuk-lekuk dan Anda mendapatkan operasi comonadic:

extract :: a <~ w a
extend :: (a <~ w b) -> (w a <~ w b)

(Ditulis dengan panah normal)

extract :: w a -> a
extend :: (w a -> b) -> w a -> w b

Perhatikan bagaimana dalam format ini, returnadalah panah yang kebetulan pas di slot argumen untuk flip (>>=), dan hal yang sama berlaku untuk extractdan extend. Hukum monad / comonad mengatakan bahwa ketika Anda memasukkan returnatau extractke dalam slot itu, hasilnya adalah panah identitas. Hukumnya sama, "hanya dengan panah dibalik". Itu jawaban super handwavey tapi semoga bisa memberikan beberapa wawasan.

Dan Burton
sumber
2
Jawaban Anda cocok dengan menghindari kesalahan tutorial monad. Monads (dan comonads) hanyalah sebuah antarmuka. Meskipun akan sangat bagus untuk mengetahui bagaimana mereka dimaksudkan . Seperti dalam: Ide di balik mereka.
Evi1M4chine