Haskell中的Comonad类型类是什么?与来自Control.Comonad in the comonad package的Comonad一样(也欢迎提供Comonad类型类的任何其他软件包的解释)。我模糊地听说过Comonad,但我真正知道的是提供extract :: w a -> a
,与Monad的return :: a -> m a
平行。
在“真实”代码中注意Comonad的“现实生活”使用的奖励积分。
答案 0 :(得分:78)
这些链接可能会有所帮助:
答案 1 :(得分:20)
这并不完全回答我的问题,但我想以答案格式提供一些相关信息:
“co”(松散地)意味着“翻转箭头”。这是一个粗略的视觉效果。
考虑monadic操作:
return :: a ~> m a
flip (>>=) :: (a ~> m b) -> (m a ~> m b)
扭转波浪形的箭头,你就会得到一些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
请注意,在这种格式中,return
是一个恰好适合flip (>>=)
的参数槽的箭头,extract
和{{1}也是如此}。 Monad / comonad法律规定,当您将extend
或return
放入该广告位时,结果就是标识箭头。法律是相同的,“只是用箭头翻转”。这是一个超级手听的答案,但希望它能提供一些见解。