Prism与Affine Traversal的对偶结构是什么?
Prism与Affine Traversal的对偶是什么?
你说得很对,先确认下已知的基础定义:
- Prism是聚焦余积类型的光学算子,核心是处理“要么匹配到目标子项,要么整个结构就是其他形态”的场景。
- Affine Traversal的定义
AffineTraversal s t a b ≅ (s -> Maybe a, (s, b) -> t)完全准确——它的getter可能找不到目标元素,但不管有没有找到,setter都能把新值b和原结构s结合生成新的t。
当你把这个定义里的Maybe从getter端移到setter端时,得到的结构就是Affine Prism(也常被称为Partial Prism),这正是你要找的对偶结构,它的同构定义是:
AffinePrism s t a b ≅ (s -> a, (s, b) -> Maybe t)
咱们拆解下这个结构的含义:
- Getter端:
s -> a——不管输入的s是什么,总能从中提取出目标元素a,不存在提取失败的情况,这和Affine Traversal的getter逻辑完全相反。 - Setter端:
(s, b) -> Maybe t——尝试用新值b替换s中的a来生成t,但这个替换操作可能失败(返回Nothing),这又和Affine Traversal的setter“总是成功”形成对偶。
再对比Prism来看这个对偶关系:Prism的标准同构是Prism s t a b ≅ (s -> Either t a, b -> t),也就是要么s本身就是t(没匹配到a),要么能提取出a;而Affine Prism则是总能提取a,但替换a的操作可能失败——相当于把Prism中“可选性”的位置从getter侧转移到了setter侧,完美对应了Affine Traversal的对偶逻辑。
举个简单的实际例子:假设s是NonEmpty String(非空字符串列表,必然有头部元素),我们想定义一个光学算子,只允许把头部元素替换为非空字符串。这个算子就是典型的Affine Prism:
- Getter:
\nonEmptyList -> head nonEmptyList(总能拿到头部元素) - Setter:
\(nonEmptyList, newHead) -> if newHead /= "" then Just (newHead : tail nonEmptyList) else Nothing(替换空字符串时失败)
另外补充一点:你提到Lens和Prism组合能得到Affine Traversal,反过来,Lens和Affine Prism组合会得到Partial Lens(定义为(s -> Maybe a, (s, b) -> Maybe t)),这也是光学算子家族里的一个常用成员。
内容的提问来源于stack exchange,提问作者Kristóf Marussy
相关产品推荐
相关产品推荐

