对what the Comonad typeclass is in Haskell有一些想法,我听说过Store的comonad。但看着Control.Comonad.Store.Lazy,我真的不明白。这是什么意思?它是为了什么?我听说Store = CoState是State Monad的双重身份。那是什么意思?什么是商店comonad?
34
A
回答
30
如果您看一下StoreT itself的定义会容易得多。
你可以把它想象成一个更大结构中的“地方”。例如,lens只是a -> Store b a
;您将得到b字段的值,并且可以使用函数b -> a
将新值重新放入更大的上下文中。
考虑在其简化的非变压器形式:
data Store s a = Store (s -> a) s
instance Functor (Store s) where
fmap f (Store g s) = Store (f . g) s
instance Extend (Store s) where
duplicate (Store f s) = Store (Store f) s
instance Comonad (Store s) where
extract (Store f s) = f s
即duplicate
改变s -> a
为s -> Store s a
刚更换后的值返回“更新”的地方,extract
恢复原始一个将该值放回到较大的结构中。
至于它关系到国家的话,你可以看看这样的:
type State s a = s -> (a, s)
type Store s a = (s -> a, s)
33
鉴于专卖店的如下定义,
data Store s a = Store { peek :: s -> a, pos :: s }
我喜欢把一个Store
作为一个大型仓库填充了a
类型的值。 a
类型的每个值都被分割到由s
类型的索引值标记的位置。最后有一辆叉车停在pos
的位置。叉车可用于extract
价值a
从商店通过拉出值从它停放的地方。您可以使用seek
将叉车移动到新的绝对位置,或使用seeks
将叉车移动到新的相对位置。要更新商店的所有值,请使用fmap
。最后extend f
类似于fmap
,除了替代f :: a -> a'
我们有f :: Store s a -> a'
它允许更新函数不仅可以访问正在更新的值,还可以访问该值的位置并访问存储中其他所有值的值。换句话说,extend
使用该值加上其周围的上下文来执行更新。
一个更加计算机的比喻是将Store
想象成一个硬盘的大盘,存储在不同位置的值以及停放在特定位置的头部。
相关问题
- 1. mongoengine-什么是referencefield商店
- 2. 什么是bigcartel商店的“checkout complete”URL?
- 3. 什么是原子商店类型?
- 4. 使用商店comonad表现康威的生活游戏
- 5. 小商店,为什么DVCS?
- 6. NonEmpty不是Comonad?
- 7. 为什么不是autoLoad的商店项目数量是0?
- 8. 为什么在商店中使用TUI?
- 9. Magento网站,商店和商店视图之间有什么区别?
- 10. MS Foodmart数据库 - 商店销售与商店成本有什么区别?
- 11. 防止代码更改商店状态的原因是什么?
- 12. 为什么我的redux商店不是不可变的?
- 13. 什么是必须有功能的网上商店(购物车)
- 14. 它是什么样的控制?在Windows商店应用程序
- 15. 如何找出我的商店ID是什么?
- 16. Ext JS - 克隆进出商店的最佳方式是什么?
- 17. 应用商店中的HTTPS - 过程是什么?
- 18. 连接商店时Mobx.inject Mobx.observer的主要区别是什么?
- 19. Windows证书商店的好处是什么?
- 20. 在Django商店中定价的正确方法是什么?
- 21. 什么是关键商店和如何实施谷歌地图
- 22. 什么是苹果应用商店提交的权威清单?
- 23. 文档商店的最佳用途是什么?
- 24. 什么是多商店的最佳解决方案?
- 25. 为什么omniauth需要OpenID提供商的商店?
- 26. Schema.org商店是否适合在线商店?
- 27. WP8日历商店像联系商店
- 28. 商店vs商店<T>
- 29. 什么是“商品软件”?
- 30. ||是什么运营商呢?
为了扩大国家和商店之间的联系,所有单子都来自伴随函子的组合。众所周知,函子'(r - > _)'(又名Reader)和'(_,r)'(翻转过来也可以,但不适合Haskell中通常的状态表示,并且不能成为Haskell中的Functor实例)是伴随的,如果你以单向方式('s - >(_,s)')构造它们,你将得到一个monad,如果你用另一种方式构造它们('(s - > _ s)')你会得到一个comonad。 – copumpkin 2012-01-08 04:24:33
@copumpkin:它不能是Functor的'(_,r)',不是吗? '(r,_)'只是'实例Functor((,)r)'。 – ehird 2012-01-08 06:07:15
是的,对不起,我错误地编辑了那个括号内的评论:) – copumpkin 2012-01-12 03:57:29