有一些想法的Comonad类型类是在Haskell什么,我听说过的商店comonad.但是看看Control.Comonad.Store.Lazy,我真的不明白.这是什么意思?它是为了什么?我听说过Store = CoState,State Monad的双重身份.那是什么意思?
Rus*_*nor 41
鉴于商店的以下定义,
data Store s a = Store { peek :: s -> a, pos :: s }
Run Code Online (Sandbox Code Playgroud)
我想把它Store看作一个充满类型价值的大仓库a.每个类型的值都a被插入到由索引值类型标记的位置s.终于有一辆叉车停在了位置上pos.叉车可以通过从停车位置拉出值来使用商店中extract的类型a值.您可以使用seek将叉车移动到新的绝对位置或用于seeks将叉车移动到新的相对位置.更新商店使用的所有值fmap.最后extend f类似于fmap除了f :: a -> a'我们之外,我们还f :: Store s a -> a'提到更新功能不仅可以访问正在更新的值,还可以访问值的位置并访问商店中其他所有值的值.换句话说,extend使用值加上其周围的上下文来执行更新.
一个更加计算机的类比是将a Store视为硬盘的大盘片,其值存储在不同位置,加上停放在特定位置的头部.
ehi*_*ird 36
如果你看一下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
Run Code Online (Sandbox Code Playgroud)
即duplicate更改s -> a为s -> Store s a只更新值后返回"更新"的位置,并通过将值放回更大的结构中来extract恢复原始a.
至于它与国家的关系,你可以这样看:
type State s a = s -> (a, s)
type Store s a = (s -> a, s)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6204 次 |
| 最近记录: |