Jaka jest typeklasa Comonad w Haskell?

105

Jaka jest typeklasa Comonad w Haskell? Tak jak w Comonad z Control.Comonad w pakiecie comonad (mile widziane są również wyjaśnienia wszystkich innych pakietów, które zapewniają typeklasę Comonad). Niewyraźnie słyszałem o Comonad, ale tak naprawdę wiem tylko o tym, że jest to extract :: w a -> acoś w rodzaju paraleli do Monady return :: a -> m a.

Dodatkowe punkty za odnotowanie użycia Comonad w „prawdziwym” kodzie.

Dan Burton
źródło
Naprawdę chciałbym zobaczyć, jaka jest różnica między „co” a normalnymi. Wiem, co to jest monada. Więc jeśli wiem, co oznacza „co”, mogę sam wywnioskować, czym jest komonada, i dogłębnie to zrozumieć. Odpowiedź Aleksieja Romanowa nic nie dała w tym względzie.
Evi1M4chine
2
@ Evi1M4chine: „co” (luźno) oznacza „odwróć strzałki”. Oto przybliżony obraz tego. Rozważmy operacje monadyczne: return :: a ~> m a, flip bind :: (a ~> m b) -> (m a ~> m b). Odwrócić falowane strzały i dostajesz comonadic operacje: 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
Dziękuję, @Dan Burton… więc podczas pracy z monadą pracujesz nad „wnętrzem” (wpychając nowe i zmienione rzeczy), z komonadą, pracujesz nad „z zewnątrz” (ostatecznie wyjmując rzeczy lub po prostu je zmieniając) . Czy ten pogląd jest poprawny? Ponieważ z pewnością bardzo pomaga w głębokim zrozumieniu.
Evi1M4chine
Comonads mogą być używane do modelowania efektów ubocznych. Oto świetne wprowadzenie do współczynników: tomasp.net/coeffects
zeronone.

Odpowiedzi:

83

Te linki mogą być pomocne:

  1. Ocenianie automatów komórkowych jest komonadyczne . W szczególności, „kiedy zobaczysz duże struktury danych złożone razem z wielu małych, ale podobnych obliczeń, istnieje duża szansa, że ​​mamy do czynienia z comonadą”.
  2. Sekwencje, strumienie i segmenty
  3. Comonads w życiu codziennym
Alexey Romanov
źródło
1
+1 Pierwszy link naprawdę go połączył.
luqui,
42
Odpowiedź dotycząca samego łącza powinna zawierać przynajmniej podsumowanie treści, do których prowadzą linki. Obecnie ta odpowiedź nie nadaje się na dobrą odpowiedź TAK. Rozważ rozszerzenie go, tak aby mógł działać samodzielnie bez powiązanych artykułów.
Bakuriu
3
„Kiedy zobaczysz duże struktury danych złożone razem z wielu małych, ale podobnych obliczeń, istnieje duża szansa, że ​​mamy do czynienia z komonadą” … Czy to oznacza, że ​​Fragment Shadery są komonadyczne?
Sam Kellett
Znalazłem ten przykład o extendbyć pomocne.
Chris Penner
22

To nie w pełni odpowiada na moje pytanie, ale chciałem umieścić kilka istotnych informacji w formacie odpowiedzi:

„co” (luźno) oznacza „odwróć strzałki”. Oto przybliżony obraz tego.

Rozważmy operacje monadyczne:

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

Odwróć faliste strzałki, a otrzymasz operacje komonadyczne:

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

(Napisane zwykłymi strzałkami)

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

Zwróć uwagę, że w tym formacie returnjest strzałka, która tak się składa, że ​​mieści się w polu argumentu for flip (>>=), i to samo dotyczy extracti extend. Prawa monad / comonad mówią, że kiedy włożysz returnlub wejdziesz extractdo tego slotu, wynikiem jest strzałka tożsamości. Prawa są takie same, „tylko z odwróconymi strzałkami”. To bardzo dobra odpowiedź, ale miejmy nadzieję, że zapewnia pewien wgląd.

Dan Burton
źródło
2
Twoja odpowiedź pasuje do uniknięcia błędnego samouczka monady. Monady (i comonady) to tylko interfejs. Chociaż naprawdę byłoby wspaniale wiedzieć, jak zostały przeznaczone . Jak w: Pomysł za nimi.
Evi1M4chine