Estou procurando uma classe como a seguinte em uma biblioteca Haskell (ou pelo menos para saber o nome matemático de tal coisa):
class Monoid patch => MyThing patch t where
applyPatch :: t -> patch -> t
Posso ter casos como este:
instance MyThing (Last t) t where
applyPatch x patch = case getLast patch of
Just y => y
Nothing => x
Mas eu também poderia ter casos como este:
instance MyThing (Dual (Map key value)) (Map key value) where
applyPatch x patch = ...
Onde o patch essencialmente adiciona e/ou substitui pares chave/valor do mapa.
Pode-se ir mais longe se você quiser fazer exclusões:
instance MyThing (Dual (Map key (Maybe value))) (Map key value) where
applyPatch x patch = ...
Além de patch
ser um monóide, a principal lei que quero que esta classe siga é a associatividade, concretamente:
forall (x :: t, y :: patch, z :: patch).
(x `applyPatch` y) `applyPatch` z == x `applyPatch` (y <> z)
Meu pensamento (bem, na verdade os ChatGPTs pensaram) que este era um "Espaço Afim" , mas o problema é que meu tipo de "patch" subjacente, embora seja um monóide, não é um grupo aditivo, porque não tem inversos.
Basicamente, acho que quero um espaço afim sem inversos. Isso existe, matematicamente ou em uma biblioteca Haskell?