对what the Comonad typeclass is in Haskell有所了解,我听说过Store comonad . 但是看着Control.Comonad.Store.Lazy,我没听说过Store = CoState,这是State Monad的双重身份 . 那是什么意思?
对what the Comonad typeclass is in Haskell有所了解,我听说过Store comonad . 但是看着Control.Comonad.Store.Lazy,我没听说过Store = CoState,这是State Monad的双重身份 . 那是什么意思?
2 回答
如果你看一下StoreT itself的定义会容易得多 .
您可以将其视为更大结构中的"place" . 例如,lens只是
a -> Store b a
;你得到了b字段的值,并且函数b -> a
将一个新值放回到更大的上下文中 .以简化的非变压器形式考虑它:
即
duplicate
将s -> a
更改为s -> Store s a
,仅在替换值后返回"updated"位置,extract
通过将值放回较大的结构来恢复原始a .至于它与国家的关系,你可以这样看:
鉴于商店的以下定义,
我想将
Store
想象成一个充满a
类型值的大仓库 . 类型a
的每个值都被插入到由s
类型的索引值标记的位置 . 终于有一辆停在pos
位置的叉车 . 叉车可以通过从停车位置拉出值来从商店使用a
类型的值 . 您可以使用seek
将叉车移动到新的绝对位置,或使用seeks
将叉车移动到新的相对位置 . 要更新商店的所有值,请使用fmap
. 最后extend f
类似于fmap
,除了f :: a -> a'
,我们有f :: Store s a -> a'
,这使得更新功能不仅可以访问正在更新的值,还可以访问值的位置并访问商店中其他所有值的值 . 换句话说,extend
使用该值加上其周围的上下文来执行更新 .更为计算机的类比是将
Store
视为硬盘的大盘,其值存储在不同位置,加上停放在特定位置的头部 .