什么是商店comonad?
对Haskell中的Comonadtypestypes有一些了解,我已经听说了Store的comonad。 但看着Control.Comonad.Store.Lazy ,我真的不明白。 这是什么意思? 这是为了什么? 我听说Store = CoState是Monad的双重身份。 那是什么意思?
如果您查看StoreT本身的定义, 则会更容易。
你可以把它想象成一个更大结构的“地方”。 例如, 镜头只是a -> Store ba
; 你得到b字段的值,而一个函数b -> a
把一个新的值放回到更大的上下文中。
考虑到它的简化,非变压器forms:
data Store sa = Store (s -> a) s instance Functor (Store s) where fmap f (Store gs) = Store (f . g) s instance Extend (Store s) where duplicate (Store fs) = Store (Store f) s instance Comonad (Store s) where extract (Store fs) = fs
即duplicate
将s -> a
改为s -> Store sa
,在更换值后返回“updated”位置,并通过将该值放回较大的结构中extract
恢复原始a 。
就其与国家的关系而言,你可以这样看待它:
type State sa = s -> (a, s) type Store sa = (s -> a, s)
鉴于存储的以下定义,
data Store sa = Store { peek :: s -> a, pos :: s }
我喜欢将Store
看作是充满了typesa
值的大仓库。 typesa
每个值被分割到由typess
的索引值标记的位置。 最后有一辆叉车停在位置pos
。 叉车可以通过从停车位置取出数值来从商店中extract
typesa
的值。 您可以使用seek
将叉车移动到新的绝对位置,或者使用叉车将叉车移动到新的相对位置。 要更新商店使用fmap
所有值。 最后extend f
类似于fmap
除了而不是f :: a -> a'
我们有f :: Store sa -> a'
,它允许更新函数不仅可以访问正在更新的值,还可以访问值的位置和访问商店中其他一切的价值。 换句话说, extend
使用该值加上其周围的上下文来执行更新。
一个更加电脑化的比喻是将Store
想象成一个存储在不同位置的值的硬盘的大盘,再加上一个头放在特定的位置。