You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在建模“补丁”的Haskell类?求对应数学概念

幺半群作用:无逆元仿射空间对应的数学结构与Haskell实现

数学定义

你描述的结构在数学中称为幺半群在集合上的左作用(Left Action of a Monoid on a Set),核心特征完全匹配你的需求:

  • 给定幺半群(patch, <>)和集合t
  • 存在操作applyPatch : t × patch → t
  • 必须满足结合律:(x applyPatchy)applyPatchz = xapplyPatch (y <> z)
  • 通常还需补充单位元定律:x applyPatch mempty = 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

你的所有实例都可以直接适配这个类:

  1. 针对Last t的实例:
instance Acts (Last t) t where
  act patch x = case getLast patch of
    Just y -> y
    Nothing -> x
  1. 针对映射补丁的实例:
instance Ord key => Acts (Dual (Map key value)) (Map key value) where
  act (Dual patch) x = x `Map.union` patch
  1. 支持删除的映射补丁实例:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:52:15