首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是Store comonad?

什么是Store comonad?
EN

Stack Overflow用户
提问于 2012-01-07 08:29:58
回答 2查看 7.5K关注 0票数 46

what the Comonad typeclass is in Haskell有一定的了解,我听说过商店的comonad。但是看看Control.Comonad.Store.Lazy,我真的不明白。什么意思?它是用来做什么的?我听说商店= CoState,国家Monad的对偶。那是什么意思?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-07 08:39:29

如果你看看StoreT itself的定义,这就容易多了。

你可以把它想象成一个更大的结构中的一个“地方”。例如,lens就是a -> Store b a;您将获取b字段的值,并使用函数b -> a将新值放回到更大的上下文中。

考虑一下它的简化的、非转换器的形式:

代码语言:javascript
复制
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

例如,duplicates -> a更改为一个s -> Store s a,在替换该值后只返回“更新”的位置,而extract通过将该值放回较大的结构来恢复原始的a。

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

代码语言:javascript
复制
type State s a = s -> (a, s)
type Store s a = (s -> a, s)
票数 37
EN

Stack Overflow用户

发布于 2012-06-25 01:29:43

给定以下存储的定义,

代码语言:javascript
复制
data Store s a = Store { peek :: s -> a, pos :: s }

我喜欢把Store看作是一个装满a类型的值的大仓库。类型a的每个值被分配到由类型s的索引值标记的位置。最后,有一辆叉车停在pos的位置。通过将a类型的值从停放的位置拉出,可以使用叉车从存储中提取该值。您可以使用seek将叉车移动到新的绝对位置,或使用seeks将叉车移动到新的相对位置。要更新存储的所有值,请使用fmap。最后,extend f类似于fmap,除了f :: a -> a'之外,我们使用了f :: Store s a -> a',它允许更新函数不仅可以访问正在更新的值,还可以访问值的位置和存储中其他所有内容的值。换句话说,extend使用该值加上它周围的上下文来执行更新。

一个更计算机化的比喻是,将Store想象成硬盘的一个大盘子,值存储在不同的位置,加上一个停在特定位置的磁头。

票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8766246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档