【问题标题】:What is the Store comonad?什么是商店comonad?
【发布时间】:2012-01-07 00:29:58
【问题描述】:

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

【问题讨论】:

    标签: haskell comonad


    【解决方案1】:

    鉴于以下商店的定义,

    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 视为硬盘的一大盘,其值存储在不同的位置,加上一个停在特定位置的磁头。

    【讨论】:

      【解决方案2】:

      如果你看一下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
      

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

      就其与 State 的关系而言,您可以这样看待它:

      type State s a = s -> (a, s)
      type Store s a = (s -> a, s)
      

      【讨论】:

      • 只是为了扩展 State 和 Store 之间的联系,所有的 monad 都是由伴随函子的组合产生的。众所周知,仿函数 (r -> _)(又名 Reader)和 (_, r)(翻转也可以,但不适合 Haskell 中通常的状态表示,并且不能是 Haskell 中的 Functor 实例)是伴随的,并且如果你以一种方式(s -> (_ , s))组合它们,你会得到一个单子,如果你用另一种方式((s -> _, s))组合它们,你会得到一个共子。
      • @copumpkin:(_, r) 不可能是 Functor,不是吗? (r, _) 就是 instance Functor ((,) r)
      • 这是一个死链接。名为 .Lazy.Strict.Memo 的模块在 2.1 版中被无缘无故删除。
      • @JoeyAdams 我冒昧地修复了断开的链接。我想我听说过 edwardk 给出了他删除 .Strict 模块的一些原因,但我忘记了原因。
      • @DanBurton:感谢您更新链接。他给出的答案是:“fmap f undefined = WriterT (Identity (undefined, undefined)) ... 它从无到有组成了很多结构”
      猜你喜欢
      • 2021-01-20
      • 2017-02-19
      • 2014-07-23
      • 1970-01-01
      • 2015-10-08
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多