是否存在建模“补丁”的Haskell类?求对应数学概念
幺半群作用:无逆元仿射空间对应的数学结构与Haskell实现
数学定义
你描述的结构在数学中称为幺半群在集合上的左作用(Left Action of a Monoid on a Set),核心特征完全匹配你的需求:
- 给定幺半群
(patch, <>)和集合t - 存在操作
applyPatch : t × patch → t - 必须满足结合律:
(xapplyPatchy)applyPatchz = xapplyPatch(y <> z) - 通常还需补充单位元定律:
xapplyPatchmempty = x(你的代码逻辑隐含了这一约束,是幺半群作用的完整定义要求)
这个结构正是去掉了“逆元”要求的仿射空间——仿射空间要求“位移”构成加法群(必须有逆元),而幺半群作用只要求补丁是幺半群,不需要逆元支持。
Haskell库中的对应实现
Haskell生态里最直接的对应类是monoid-extras库中的Acts类,定义在Data.Monoid.Action模块:
class (Monoid m) => Acts m a where act :: m -> a -> a
该类的参数顺序和你的applyPatch相反(补丁在前,目标在后),但逻辑等价,你可以轻松封装成需要的形式:
applyPatch :: Acts patch t => t -> patch -> t applyPatch x p = act p x
你的所有实例都可以直接适配这个类:
- 针对
Last t的实例:
instance Acts (Last t) t where act patch x = case getLast patch of Just y -> y Nothing -> x
- 针对映射补丁的实例:
instance Ord key => Acts (Dual (Map key value)) (Map key value) where act (Dual patch) x = x `Map.union` patch
- 支持删除的映射补丁实例:
instance Ord key => Acts (Dual (Map key (Maybe value))) (Map key value) where act (Dual patch) x = Map.foldrWithKey (\k mv acc -> case mv of Just v -> Map.insert k v acc Nothing -> Map.delete k acc) x patch
这些实现都严格遵循幺半群作用的结合律和单位元定律。
内容的提问来源于stack exchange,提问作者Clinton
相关产品推荐
相关产品推荐

