Qual è la class di caratteri Comonad in Haskell?

Qual è la class di caratteri Comonad in Haskell? Come in Comonad di Control.Comonad nel pacchetto di Comonad (sono benvenute anche le spiegazioni di ogni altro pacchetto che fornisce una class di caratteri Comonad). Ho sentito vagamente parlare di Comonad, ma tutto ciò che so davvero è che fornisce extract :: wa -> a , extract :: wa -> a sorta di parallelo al return :: a -> ma di Monad return :: a -> ma .

Punti bonus per l’annotazione degli usi “reali” di Comonad nel codice “reale”.

Questi collegamenti possono essere utili:

  1. La valutazione degli automi cellulari è comonadica . In particolare, “ogni volta che si vedono grandi strutture di dati messe insieme da molti calcoli piccoli ma simili, ci sono buone probabilità che abbiamo a che fare con una comonade”.
  2. Sequenze, flussi e segmenti
  3. Comonade nella vita di tutti i giorni

Questo non risponde completamente alla mia domanda, ma volevo inserire alcune informazioni rilevanti nel formato di risposta:

“co” (liberamente) significa “capovolgere le frecce”. Ecco una visione approssimativa di questo.

Considera le operazioni monadiche:

 return :: a ~> ma flip (>>=) :: (a ~> mb) -> (ma ~> mb) 

Inverti le frecce ondulate e ottieni le operazioni comonadiche:

 extract :: a <~ wa extend :: (a <~ wb) -> (wa <~ wb) 

(Scritto con le normali frecce)

 extract :: wa -> a extend :: (wa -> b) -> wa -> wb 

Notate come in questo formato, return è una freccia che per caso si adatta allo slot argomento per flip (>>=) , e lo stesso vale per extract ed extend . Le leggi Monad / Comonad affermano che quando si inserisce un return o un extract in quello slot, il risultato è la freccia dell'id quadro. Le leggi sono le stesse, "solo con le frecce capovolte". Questa è una super risposta a mano per mano, ma si spera che fornisca qualche intuizione.