【发布时间】:2012-01-07 00:29:58
【问题描述】:
对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 的对偶。这是什么意思?
【问题讨论】:
鉴于以下商店的定义,
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 视为硬盘的一大盘,其值存储在不同的位置,加上一个停在特定位置的磁头。
【讨论】:
如果你看一下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 通过将值放回更大的结构中来恢复原始 a .
就其与 State 的关系而言,您可以这样看待它:
type State s a = s -> (a, s)
type Store s a = (s -> a, s)
【讨论】:
(r -> _)(又名 Reader)和 (_, r)(翻转也可以,但不适合 Haskell 中通常的状态表示,并且不能是 Haskell 中的 Functor 实例)是伴随的,并且如果你以一种方式(s -> (_ , s))组合它们,你会得到一个单子,如果你用另一种方式((s -> _, s))组合它们,你会得到一个共子。
(_, r) 不可能是 Functor,不是吗? (r, _) 就是 instance Functor ((,) r)。
.Lazy、.Strict 和 .Memo 的模块在 2.1 版中被无缘无故删除。
.Strict 模块的一些原因,但我忘记了原因。