46

对 Haskell 中的 Comonad 类型类有所了解后,我听说过 Store comonad。但是看着Control.Comonad.Store.Lazy,我真的不明白。这是什么意思?它是干什么用的?我听说 Store = CoState,State Monad 的对偶。这意味着什么?

4

2 回答 2

48

给定以下商店的定义,

data Store s a = Store { peek :: s -> a, pos :: s }

我喜欢把 a 想象Store成一个装满 type 值的大仓库a。type 的每个值都a被插入到由 type 的索引值标记的位置s。终于有一辆叉车停在了位置pos。叉车可以通过从它停放的地方拉出价值来从商店extract中使用类型的价值。a您可以使用seek将叉车移动到新的绝对位置或使用seeks将叉车移动到新的相对位置。要更新商店的所有值,请使用fmap. finallyextend f类似于fmapexcept 而不是f :: a -> a'我们有f :: Store s a -> a'这使得更新函数不仅可以访问正在更新的值,还可以访问该值的位置以及访问存储中其他所有内容的值。换句话说,extend使用该值加上其周围的上下文来执行更新。

更计算机化的类比是将 aStore视为硬盘的大盘,其值存储在不同的位置,加上一个停在特定位置的磁头。

于 2012-06-24T17:29:42.803 回答
37

如果您查看StoreT 本身的定义,会容易得多。

您可以将其视为更大结构中的“地方”。例如,镜头只是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

ie将 aduplicate更改s -> as -> Store s a在替换值后仅返回“更新”位置的 a,并通过将值放回更大的结构中来extract恢复原始a 。

至于它与 State 的关系,你可以这样看:

type State s a = s -> (a, s)
type Store s a = (s -> a, s)
于 2012-01-07T00:39:28.763 回答