Haskell中的Comonad类型类是什么?


105

Haskell中的Comonad类型类是什么?与Control.Comonad的comonad包中的Comonad一样(也欢迎对提供Comonad类型类的任何其他包进行解释)。我隐约听到了Comonad的信息,但我真正了解的只是它提供的东西extract :: w a -> a,与Monad的相似return :: a -> m a

在“真实”代码中指出Comonad的“真实生活”用法的加分点。


我真的很想看看“合作”与“正常”之间的区别是什么。我知道什么是单子。因此,如果我知道“合作”的含义,那么我可以总结自己,什么是共鸣,并深入理解它。阿列克谢·罗曼诺夫(Alexey Romanov)的回答在这方面没有做任何事情。
Evi1M4chine

2
@ Evi1M4chine:“宽松”的意思是“翻转箭头”。这是一个大概的视觉效果。考虑单子操作:return :: a ~> m aflip bind :: (a ~> m b) -> (m a ~> m b)。扭转弯弯曲曲的箭头,您将获得平息的操作:extract :: a <~ w aextend :: (a <~ w b) -> (w a <~ w b)extract :: w a -> aextend :: (w a -> b) -> w a -> w b
Dan Burton

谢谢@丹·伯顿(Dan Burton)……所以,在一个单子的同时,您在“内部”工作(在其中填充新的和更改的东西),在一个单子的同时,在“外部”工作(最终将其取出或只是对其进行修改) 。这种观点正确吗?因为它对深入的了解肯定会有所帮助。
Evi1M4chine

comonads可用于建模协同效应。这是对coeffects
zeronone

Answers:


83

这些链接可能会有所帮助:

  1. 评估细胞自动机是昏迷的。特别是,“只要您看到大量的数据结构都由许多小的但相似的计算拼凑而成,就有很大的机会来处理comonad”。
  2. 序列,流和段
  3. 日常生活中的共鸣

1
+1第一个链接是真正为我带来联系的链接。
luqui 2011年

42
仅链接的答案至少应包含链接内容的摘要。目前,此答案不适合作为一个很好的SO答案。请考虑对其进行扩展,以便它可以独立存在而无需链接文章。
Bakuriu 2014年

3
“只要您看到大量的数据结构都由许多小的但相似的计算拼凑而成,就很有可能我们正在处理comonad。” ……那么,这是否意味着片段着色器是comonadic的?
山姆·凯利特

我发现这个例子extend是有帮助的。
克里斯·彭纳

22

这不能完全回答我的问题,但是我想以回答格式输入一些相关信息:

“ co”(宽松地)表示“翻转箭头”。这是一个大概的视觉效果。

考虑单子运算:

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

扭转弯曲的箭头,您将获得常规操作:

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

(用普通箭头写)

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

请注意,在这种格式,return是恰好适合于对参数槽的箭头flip (>>=),同样是真正的extractextend。Monad / comonad法律规定,当您将该插槽放入returnextract插入该插槽时,结果是标识箭头。规律是相同的,“只是箭头翻转了”。这是一个超级动摇的答案,但希望它能提供一些见识。


2
您的回答很好,避免了monad教程的谬误。Monad(和comonads)只是一个接口。尽管知道它们的意图确实很棒。如:他们背后的想法。
Evi1M4chine
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.