什么是商店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 

duplicates -> 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 。 叉车可以通过从停车位置取出数值来从商店中extracttypesa的值。 您可以使用seek将叉车移动到新的绝对位置,或者使用叉车将叉车移动到新的相对位置。 要更新商店使用fmap所有值。 最后extend f类似于fmap除了而不是f :: a -> a'我们有f :: Store sa -> a' ,它允许更新函数不仅可以访问正在更新的值,还可以访问值的位置和访问商店中其他一切的价值。 换句话说, extend使用该值加上其周围的上下文来执行更新。

一个更加电脑化的比喻是将Store想象成一个存储在不同位置的值的硬盘的大盘,再加上一个头放在特定的位置。