Language agnostic 编程中的幺半群/半群示例

Language agnostic 编程中的幺半群/半群示例,language-agnostic,math,computer-science,monoids,abstract-algebra,Language Agnostic,Math,Computer Science,Monoids,Abstract Algebra,众所周知,幺半群在编程中无处不在。它们无处不在,非常有用,作为一个“爱好项目”,我正在开发一个完全基于它们属性的系统(分布式数据聚合)。为了使系统有用,我需要有用的幺半群:) 我已经知道: 数字和或矩阵和 数值积或矩阵积 具有顶部或底部元素的总订单下的最小值或最大值(更一般地说,在有界格中连接或相遇,或者更一般地说,在类别中的乘积或副乘积) 集管接头 使用幺半群连接冲突值的映射并集 有限集子集的交集(如果我们谈到半群,则仅指集合交集) 地图与有界关键域的交点(此处相同) 排序序列的合并,可能是

众所周知,幺半群在编程中无处不在。它们无处不在,非常有用,作为一个“爱好项目”,我正在开发一个完全基于它们属性的系统(分布式数据聚合)。为了使系统有用,我需要有用的幺半群:)

我已经知道:

  • 数字和或矩阵和
  • 数值积或矩阵积
  • 具有顶部或底部元素的总订单下的最小值或最大值(更一般地说,在有界格中连接或相遇,或者更一般地说,在类别中的乘积或副乘积)
  • 集管接头
  • 使用幺半群连接冲突值的映射并集
  • 有限集子集的交集(如果我们谈到半群,则仅指集合交集)
  • 地图与有界关键域的交点(此处相同)
  • 排序序列的合并,可能是通过在不同的幺半群/半群中连接相等的键值
  • 排序列表的有界合并(与上面相同,但我们取结果的前N个)
  • 两个幺半群或半群的笛卡尔积
  • 列表串联
  • 自同态合成
现在,让我们将一个操作的准属性定义为一个保持等价关系的属性。例如,如果我们考虑相等长度的列表或相同的内容到置换等价,则列表级联是准交换的。 下面是一些拟幺半群和拟交换幺半群和半群:

    任何(A+B=A或B,如果我们考虑载波集合的所有元素是等价的)
  • 任何满足谓词(A+B=A和B的非空且满足某些谓词P的一个,如果没有一个则为空;如果我们考虑所有满足P等价的元素)
  • 随机样本的有界混合(XS+YS=从XS和YS的级联中的大小N的随机样本;如果我们考虑到与整个数据集相同的分布的任何两个样本是等价的)
  • 加权随机样本的有界混合
  • 让我们称之为“拓扑合并”:给定两个非循环且不矛盾的依赖关系图,一个包含这两个图中指定的所有依赖关系的图。例如,列表“串联”可以产生任何排列,其中每个列表的元素按顺序排列(例如,123+456=142356)

还有哪些其他的呢?

Haskell标准库由于在其类型类中使用了实际的数学术语而受到赞扬和攻击。(在我看来,这是一件好事,因为没有它,我甚至不知道什么是幺半群!)。在任何情况下,您都可以查看更多示例:

  • 任何幺半群的对偶都是幺半群:给定a+b,定义一个新的运算++,其中a++b=b+a
  • 布尔函数的合取与析取
  • 在Maybe monad(在Ocaml中称为“option”)上,第一个和最后一个。也就是说,第一(只是a)b=只是a first (Just a) b = Just a first Nothing b = b 第一无b=最后一无
后者只是与单子和箭头相关的整个幺半群家族的冰山一角,但我不能真正理解这些(除了简单的一元自同态)。但是谷歌搜索单子幺半群时,会发现很多。

是形成幺半群(拟幺半群?)的另一种方法:给定幺半群M和与乘法兼容的等价关系,它会给出另一个幺半群。例如:

  • 有并集的有限多集:如果A*是自由幺半群(带串联的列表),~is“是”关系的置换,那么A*/~是自由交换幺半群

  • 有并集的有限集:如果~被修改为忽略元素的计数(因此“aa”~“a”),则a*/~是自由交换幂等幺半群

  • 句法幺半群:任何正规语言都会通过“语言不可区分性”关系产生句法幺半群,即A*的商。是这个想法的一个手指树实现。例如,语言{a3n:n natural}将Z3作为语法幺半群

商幺半群自动带有满射的同态M->M/~

“对偶”结构是子幺半群。它们的同态A->M是内射的

关于幺半群的另一个构造是


幺半群允许通过O(logn)平方和快速并行计算来实现指数化。它们也是。

交换幺半群的一个非常有用的例子是逻辑和约束语言的统一。有关可能的统一算法的精确定义,请参见“计算机编程的概念、技术和模型”第2.8.2.2节


祝你的语言好运!我正在用并行语言做类似的事情,使用幺半群合并并行计算的子结果。

任意长度罗马数字值计算。

没错,我完全忘记了二元论和布尔论!至于Maybe monad,这个例子本质上被称为“任何令人满意的谓词”。Monad自同态也是一个好主意。我回滚了对标记的更改,因为在我看来,问题根本不是关于函数编程。Offtopic:如何使用并行计算折叠幺半群?@Andrey如果幺半群是可交换的,您可以在任意线程/处理器/机器上按任意顺序将值相加,直到只剩下一个值(或者您可以使每台机器保持1个值,并在读取访问期间以某种方式将它们相加,等等)。我将只使用交换幺半群。如果幺半群是非交换的,那么您可以使用在值列表上构建的平衡树来添加值:级别按顺序遍历,但每个级别上的节点可以并行减少。另请参阅Guy Blelloch关于向量并行性的著作;你能谈谈张量积的用处吗?这篇文章没有提供任何例子,我也不是alg的铁杆