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".


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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.