O que é a typeclass Comonad em Haskell?

105

O que é a typeclass Comonad em Haskell? Como em Comonad de Control.Comonad no pacote comonad (explicações de quaisquer outros pacotes que fornecem uma typeclass Comonad também são bem-vindas). Ouvi vagamente sobre o Comonad, mas tudo o que realmente sei sobre ele é que ele fornece extract :: w a -> a, uma espécie de paralelo com o do Monad return :: a -> m a.

Pontos de bônus por observar os usos do Comonad na "vida real" no código "real".

Dan Burton
fonte
Eu realmente gostaria de ver qual é a diferença entre “co” e normal. Eu sei o que é uma mônada. Portanto, se eu sei o que o “co” significa, posso concluir por mim mesmo, o que é um comonad, e entendê-lo profundamente. A resposta de Alexey Romanov não fez nada nesse aspecto.
Evi1M4chine
2
@ Evi1M4chine: "co" (vagamente) significa "vire as setas". Aqui está uma visão aproximada disso. Considere as operações monádicas: return :: a ~> m a, flip bind :: (a ~> m b) -> (m a ~> m b). Reverter os squiggly setas e você começa as operações 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
Obrigado @Dan Burton ... então, enquanto com uma mônada, você trabalha no "interior" (colocando coisas novas e alteradas), com uma comonada, você trabalha no "exterior" (tirando coisas finalmente ou apenas para alterá-las) . Essa visão está correta? Porque com certeza ajuda muito com o entendimento profundo.
Evi1M4chine
comonads podem ser usados ​​para modelar co-efeitos. Esta é uma ótima introdução aos coeficientes: tomasp.net/coeffects
zeronone

Respostas:

83

Esses links podem ser úteis:

  1. Avaliar autômatos celulares é comum . Em particular, "sempre que você vir grandes estruturas de dados reunidas a partir de muitos cálculos pequenos, mas semelhantes, há uma boa chance de estarmos lidando com um comonad".
  2. Sequências, fluxos e segmentos
  3. Comônadas na vida cotidiana
Alexey Romanov
fonte
1
+1 O primeiro link foi o que realmente trouxe tudo para mim.
luqui
42
A resposta apenas com link deve conter pelo menos um resumo do conteúdo do link. Atualmente, esta resposta não é adequada para ser uma boa resposta SO. Considere expandi-lo um pouco, para que ele fique por conta própria sem os artigos vinculados.
Bakuriu
3
"sempre que você vir grandes estruturas de dados reunidas a partir de muitos cálculos pequenos, mas semelhantes, há uma boa chance de estarmos lidando com um comonad" ... Isso significa que os shaders de fragmento são comonádicos?
Sam Kellett,
Eu encontrei este exemplo de extendpara ser útil.
Chris Penner
22

Isso não responde totalmente à minha pergunta, mas eu queria colocar algumas informações relevantes no formato de resposta:

"co" (vagamente) significa "virar as setas". Aqui está uma visão aproximada disso.

Considere as operações monádicas:

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

Inverta as setas onduladas e você obterá as operações comuns:

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

(Escrito com setas normais)

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

Observe como, neste formato, returnhá uma seta que por acaso se encaixa no slot de argumento para flip (>>=), e o mesmo é verdadeiro para extracte extend. As leis de mônada / comonada dizem que quando você coloca returnou extractentra nesse slot, o resultado é a seta de identidade. As leis são as mesmas, "apenas com as setas viradas". Essa é uma resposta excelente, mas espero que forneça alguns insights.

Dan Burton
fonte
2
Sua resposta vai bem para evitar a falácia do tutorial da mônada. Mônadas (e comonadas) são apenas uma interface. Embora fosse realmente ótimo saber como foram concebidos . Como em: A ideia por trás deles.
Evi1M4chine