Control.Lens中Market类型的命名缘由及与store monad/comonad的关联询问
Market类型与Store Comonad/Monad的关联 你的推测完全正确!Market类型确实和store comonad(以及相关的monad变体)有着直接的血缘关系,它的命名也正是源于这种和“存储-交换”相关的核心语义。
先从你熟悉的Store comonad说起:标准的Store s a结构可以理解为一个“存储单元”——它包含一个当前状态s,以及一个从状态中读取值a的函数(s -> a)。这个结构是Lens这类光学元件的核心基础之一,因为Lens本质上就是在处理“从状态中读取值、并更新值”的操作,而Store comonad刚好封装了这种“持有状态+访问能力”的特性。
再看Market a b s t:它可以看成是Store comonad的双向扩展版本。它的结构里包含三个部分:
- 一个提取函数
(s -> b):从当前状态s中提取出b(类似Store的读取能力) - 一个注入函数
(a -> t):用新的a生成对应的t(这是Store没有的反向操作) - 当前的状态
s:和Store一样,持有当前的“基准状态”
这种结构完美对应了Prism的能力——Prism既可以检查一个值是否匹配某个模式(提取b),也可以将一个值注入到模式中生成新的结构(用a得到t)。而“Market”这个名字的由来,正是因为它像一个小型交易市场:你可以从里面取出商品(提取b),也可以把新的商品放进去(注入a得到t),整个过程围绕着“存储的状态”进行双向操作,和Store的“单向存储访问”是同一系列的概念。
顺便提一下你提到的Bazaar:Bazaar是多个Store-like结构的组合(所以它叫indexed Cartesian store comonad),而Market则是单个的、支持双向操作的Store变体——两者都属于“基于存储的comonad”家族,只是分别对应了不同类型的光学元件(Bazaar对应Traversal,Market对应Prism)。
总结来说,你的推测完全准确,Market确实是store monad/comonad家族的一员,它的设计和命名都围绕着“存储-交换”的核心语义展开。
内容的提问来源于stack exchange,提问作者Joe

