一个小组扩展了幺半群的概念以允许反转。这允许:
gremove :: (Group a) => a -> a -> a
gremove x y = x `mappend` (invert y)
但是自然数这样的结构怎么样呢?我在考虑:
class (Monoid a) => MRemove a where
mremove :: a -> a -> a
有法律:
x `mremove` x = mempty
x `mremove` mempty = x
(x `mappend` y) `mremove` y = x
另外:
class (MRemove a) => Group a where
invert :: a -> a
invert x = mempty `mremove` x
-- | For defining MRemove in terms of Group
defaultMRemove :: (Group a) => a -> a -> a
defaultMRemove x y = x `mappend` (invert y)
所以,我的问题是:什么是MRemove
?
答案 0 :(得分:8)
我能想到的最接近的共同结构是一个光标,但它并没有以明显的方式真正适用于自然。想想您可以对时间值执行的操作:
很少有关于时间值对的其他操作是有意义的。你不能在代数中添加时间或乘以它们或我们习惯的任何东西。另一方面,区间类型更灵活,支持加法,减法,反演等。因此,可以在Haskell中将一个游标定义为:
class Group (Diff a) => Torsor a where
type Diff a
subtract : a -> a -> Diff a
add : a -> Diff a -> a
无论如何,这是尝试回答你的直接问题(你可以在John Baez的优秀page on them找到更多信息),尽管它不包括你的自然范例。
据我所知,接近回答你问题的唯一另一件事是Coq's (semi)ring solver tactic中代码重用的解决方案。他们引入了一个“几乎环”的概念,其公理类似于你描述的公理,允许他们将大部分代码重用于自然以及完整的环。不过,我认为这个想法并不广泛。
答案 1 :(得分:6)
你要找的名字是取消monoid ,但严格来说,取消半群足以捕捉减法的概念。大约一年前我对同一个问题感到疑惑,我通过挖掘数学术语找到了答案。查看incremental-parser包中的CancellativeMonoid类。我目前正在准备一个新的软件包,它只包含monoid子类和一些实例,我希望尽快发布它。
答案 2 :(得分:1)
有人提出了类似的问题here。给出的答案是commutative monoid with monus。
答案 3 :(得分:0)
看看subtraction semigroups。它是一个半群,有一个减法运算符,遵守这些定律:
segmentValueChanged
可悲的是,我找不到讨论减法幺半群的资源,但我认为它需要遵守以下附加法律:
x - (y - x) = x
x - (x - y) = y - (y - x)
(x - y) - z = (x - z) - y
x <> (y - z) = (x <> y) - (x <> z)
(y - z) <> x = (y <> x) - (z <> x)