Qual è la classe di caratteri Comonad in Haskell?


105

Qual è la classe di caratteri Comonad in Haskell? Come in Comonad da Control.Comonad nel pacchetto comonad (sono benvenute anche spiegazioni di qualsiasi altro pacchetto che fornisce una classe di caratteri Comonad). Ho vagamente sentito parlare di Comonad, ma tutto quello che so veramente è che fornisce extract :: w a -> a, una sorta di parallelo a Monad return :: a -> m a.

Punti bonus per aver notato usi "reali" di Comonad nel codice "reale".


Mi piacerebbe davvero vedere qual è la differenza tra "co" e normale. So cos'è una monade. Quindi, se so cosa significa "co", posso concludere da solo, cos'è un comonad e capirlo profondamente. La risposta di Alexey Romanov non ha fatto nulla in questo aspetto.
Evi1M4chine

2
@ Evi1M4chine: "co" (vagamente) significa "capovolgi le frecce". Ecco una visione approssimativa di questo. Considera le operazioni monadiche: return :: a ~> m a, flip bind :: (a ~> m b) -> (m a ~> m b). Invertire i ondulate frecce e si ottiene le operazioni 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

Grazie @ Dan Burton ... quindi mentre con una monade lavori all '"interno" (inserendo cose nuove e alterate), con un comonad, lavori all' "esterno" (tirando fuori le cose alla fine o semplicemente per modificarle) . Quella vista è corretta? Perché sicuramente aiuta molto con la comprensione profonda.
Evi1M4chine

le comonad possono essere utilizzate per modellare i co-effetti. Ecco un'ottima introduzione ai coeffects: tomasp.net/coeffects
zeronone

Risposte:


83

Questi collegamenti possono essere utili:

  1. La valutazione degli automi cellulari è comonadica . In particolare, "ogni volta che si vedono strutture di dati di grandi dimensioni messe insieme da molti calcoli piccoli ma simili, ci sono buone probabilità che si tratti di una comonad".
  2. Sequenze, flussi e segmenti
  3. Comonadi nella vita di tutti i giorni

1
+1 Il primo collegamento è stato quello che lo ha veramente unito per me.
luqui

42
La risposta solo link dovrebbe contenere almeno un riepilogo dei contenuti collegati. Attualmente questa risposta non è adatta per essere una buona risposta SO. Considera l'idea di espanderlo un po ', in modo che possa stare in piedi da solo senza gli articoli collegati.
Bakuriu

3
"ogni volta che vedi grandi strutture di dati messe insieme da molti calcoli piccoli ma simili, ci sono buone probabilità che abbiamo a che fare con un comonad" .... Quindi questo significa che gli shader di frammenti sono comonadici?
Sam Kellett

Ho trovato utile questo esempio di extend.
Chris Penner

22

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

"co" (vagamente) significa "capovolgere le frecce". Ecco una visione approssimativa di questo.

Considera le operazioni monadiche:

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

Inverti le frecce ondulate e ottieni le operazioni comonadiche:

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

(Scritto con frecce normali)

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

Si noti come in questo formato returnuna freccia si adatti allo slot dell'argomento per flip (>>=), e lo stesso vale per extracte extend. Le leggi della monade / comonade dicono che quando metti returno extractin quello slot, il risultato è la freccia dell'identità. Le leggi sono le stesse, "solo con le frecce girate". È una risposta super handwavey ma si spera che fornisca alcune informazioni.


2
La tua risposta va bene evitando l'errore del tutorial sulla monade. Le monadi (e le comonadi) sono solo un'interfaccia. Anche se sarebbe davvero bello sapere come erano destinati . Come in: L'idea dietro di loro.
Evi1M4chine
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.