Quelle est la classe de types Comonad dans Haskell?

105

Quelle est la classe de types Comonad dans Haskell? Comme dans Comonad de Control.Comonad dans le paquet comonad (les explications de tout autre paquet qui fournit une classe de type Comonad sont également les bienvenues). J'ai vaguement entendu parler de Comonad, mais tout ce que je sais vraiment, c'est qu'il fournit extract :: w a -> a, une sorte de parallèle avec Monad return :: a -> m a.

Points bonus pour avoir noté les utilisations «réelles» de Comonad dans du code «réel».

Dan Burton
la source
J'aimerais vraiment voir quelle est la différence entre «co» et normal. Je sais ce qu'est une monade. Donc, si je sais ce que signifie le «co», je peux me conclure, ce qu'est un comonad, et le comprendre profondément. La réponse d'Alexey Romanov n'a rien fait à cet égard.
Evi1M4chine
2
@ Evi1M4chine: "co" (vaguement) signifie "retourner les flèches". En voici un aperçu approximatif. Considérez les opérations monadiques: return :: a ~> m a, flip bind :: (a ~> m b) -> (m a ~> m b). Inverser les flèches squiggly et vous obtenez les opérations 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
Merci @Dan Burton… alors avec une monade, vous travaillez sur «l'intérieur» (fourrer des choses nouvelles et modifiées), avec un comonad, vous travaillez sur «l'extérieur» (retirer les choses enfin ou simplement les modifier) . Ce point de vue est-il correct? Parce que cela aide certainement beaucoup à la compréhension profonde.
Evi1M4chine
Les comonads peuvent être utilisés pour modéliser les co-effets. Voici une excellente introduction aux coeffets: tomasp.net/coeffects
zeronone

Réponses:

83

Ces liens peuvent être utiles:

  1. L'évaluation des automates cellulaires est comonadique . En particulier, "chaque fois que vous voyez de grandes structures de données reconstituées à partir de nombreux calculs petits mais similaires, il y a de fortes chances que nous ayons affaire à une comonade".
  2. Séquences, flux et segments
  3. Comonads au quotidien
Alexey Romanov
la source
1
+1 Le premier lien est celui qui a vraiment réuni pour moi.
luqui
42
La réponse de lien uniquement doit au moins contenir un résumé du contenu lié. Actuellement, cette réponse n'est pas adaptée pour être une bonne réponse SO. Pensez à l'élargir un peu, afin qu'il puisse se tenir seul sans les articles liés.
Bakuriu
3
"chaque fois que vous voyez de grandes structures de données reconstituées à partir de nombreux calculs petits mais similaires, il y a de fortes chances que nous ayons affaire à un comonad" ... Cela signifie-t-il que les shaders de fragments sont comonadiques?
Sam Kellett
Je trouve cet exemple de extendêtre utile.
Chris Penner
22

Cela ne répond pas entièrement à ma question, mais je voulais mettre quelques informations pertinentes sous forme de réponse:

"co" (vaguement) signifie "retourner les flèches". En voici un aperçu approximatif.

Considérez les opérations monadiques:

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

Inversez les flèches ondulées et vous obtenez les opérations comonadiques:

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

(Écrit avec des flèches normales)

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

Remarquez comment, dans ce format, se returntrouve une flèche qui se trouve juste dans l'emplacement d'argument pour flip (>>=), et la même chose est vraie pour extractet extend. Les lois de la monade / comonade disent que lorsque vous mettez returnou extractdans cette fente, le résultat est la flèche d'identité. Les lois sont les mêmes, "juste avec les flèches retournées". C'est une réponse super maniable, mais j'espère qu'elle fournit un aperçu.

Dan Burton
la source
2
Votre réponse va bien en évitant l'erreur du didacticiel de la monade. Les monades (et les comonades) ne sont qu'une interface. Bien qu'il serait en effet formidable de savoir comment ils ont été prévus . Comme dans: L'idée derrière eux.
Evi1M4chine