Was ist die Comonad-Typklasse in Haskell?

105

Was ist die Comonad-Typklasse in Haskell? Wie in Comonad von Control.Comonad im Comonad-Paket (Erläuterungen zu anderen Paketen, die eine Comonad-Typklasse bereitstellen, sind ebenfalls willkommen). Ich habe vage von Comonad gehört, aber alles, was ich wirklich darüber weiß, ist, dass es eine extract :: w a -> aArt Parallele zu Monad bietet return :: a -> m a.

Bonuspunkte für das Notieren der Verwendung von Comonad im "echten" Code im "echten" Code.

Dan Burton
quelle
Ich würde wirklich gerne sehen, was der Unterschied zwischen "co" und normal ist. Ich weiß, was eine Monade ist. Wenn ich also weiß, was das „Co“ bedeutet, kann ich mich selbst zu dem Schluss machen, was eine Comonade ist, und es tief verstehen. Die Antwort von Alexey Romanov hat in dieser Hinsicht nichts bewirkt.
Evi1M4chine
2
@ Evi1M4chine: "co" (lose) bedeutet "Flip the Arrows". Hier ist ein grobes Bild davon. Betrachten Sie die monadischen Operationen: return :: a ~> m a, flip bind :: (a ~> m b) -> (m a ~> m b). Kehren Sie die schnörkellosen Pfeile um und Sie erhalten die komonadischen Operationen : 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
Vielen Dank an Dan Burton. Während Sie mit einer Monade an der „Innenseite“ arbeiten (neue und veränderte Dinge hineinstecken), arbeiten Sie mit einer Comonade an der „Außenseite“ (Dinge endgültig herausnehmen oder nur um sie zu ändern). . Ist diese Ansicht richtig? Weil es sicherlich viel beim tiefen Verständnis hilft.
Evi1M4chine
Mit Comonaden können Koeffekte modelliert werden. Hier ist eine großartige Einführung in Koeffizienten: tomasp.net/coeffects
Zeronone

Antworten:

83

Diese Links können hilfreich sein:

  1. Die Auswertung von zellularen Automaten ist komonadisch . Insbesondere "wenn Sie große Datenstrukturen sehen, die aus vielen kleinen, aber ähnlichen Berechnungen zusammengesetzt sind, besteht eine gute Chance, dass es sich um eine Comonade handelt".
  2. Sequenzen, Streams und Segmente
  3. Comonaden im Alltag
Alexey Romanov
quelle
1
+1 Der erste Link hat mich wirklich zusammengebracht.
Luqui
42
Nur-Link-Antworten sollten mindestens eine Zusammenfassung der verknüpften Inhalte enthalten. Derzeit ist diese Antwort nicht für eine gute SO-Antwort geeignet. Erwägen Sie, es ein wenig zu erweitern, damit es ohne die verknüpften Artikel für sich alleine stehen kann.
Bakuriu
3
"Wenn Sie große Datenstrukturen sehen, die aus vielen kleinen, aber ähnlichen Berechnungen zusammengesetzt sind, besteht eine gute Chance, dass es sich um eine Comonade handelt." .... Bedeutet das also, dass Fragment-Shader Comonadic sind?
Sam Kellett
Ich fand dieses Beispiel von extendhilfreich sein.
Chris Penner
22

Dies beantwortet meine Frage nicht vollständig, aber ich wollte einige relevante Informationen in das Antwortformat bringen:

"co" bedeutet (locker) "die Pfeile umdrehen". Hier ist ein grobes Bild davon.

Betrachten Sie die monadischen Operationen:

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

Kehren Sie die wellenförmigen Pfeile um und Sie erhalten die comonadischen Operationen:

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

(Geschrieben mit normalen Pfeilen)

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

Beachten Sie, dass in diesem Format returnein Pfeil in den Argumentschlitz für passt flip (>>=), und dasselbe gilt für extractund extend. Monaden- / Comonadengesetze besagen, dass das Ergebnis der Identitätspfeil ist , wenn Sie diesen Slot einsetzen returnoder extractin diesen stecken . Die Gesetze sind die gleichen, "nur mit umgedrehten Pfeilen". Das ist eine super handwavey Antwort, aber hoffentlich gibt es einen Einblick.

Dan Burton
quelle
2
Ihre Antwort passt gut dazu, den Irrtum des Monadentutorials zu vermeiden. Monaden (und Comonaden) sind nur eine Schnittstelle. Obwohl es in der Tat toll wäre zu wissen, wie sie beabsichtigt waren . Wie in: Die Idee dahinter.
Evi1M4chine