Math 代数结构与程序设计

Math 代数结构与程序设计,math,mathematical-optimization,reusability,Math,Mathematical Optimization,Reusability,有谁能给我举个例子,说明我们如何使用代数结构(如群、幺半群和环)来提高代码的可重用性?(或者我怎么能在编程中使用这些结构,至少我知道我在高中时并没有白学这些理论) 我听说这是可能的,但我想不出一种方法将它们应用到编程中,并将核心数学应用到编程中。由于我不知道计算机科学世界中存在这种东西,请忽略这个答案;) 我不认为这两个领域(没有双关语)有任何重叠。环/场/组处理数学对象。考虑字段定义的一部分: 对于F中的每个a,都存在一个元素−F中的a,使得a+(−a) =0。类似地,对于F中除0以外的任何

有谁能给我举个例子,说明我们如何使用代数结构(如群、幺半群和环)来提高代码的可重用性?(或者我怎么能在编程中使用这些结构,至少我知道我在高中时并没有白学这些理论)


我听说这是可能的,但我想不出一种方法将它们应用到编程中,并将核心数学应用到编程中。

由于我不知道计算机科学世界中存在这种东西,请忽略这个答案;)


我不认为这两个领域(没有双关语)有任何重叠。环/场/组处理数学对象。考虑字段定义的一部分:

对于F中的每个a,都存在一个元素−F中的a,使得a+(−a) =0。类似地,对于F中除0以外的任何a,都存在一个元素a^−F中的1,使得a·a^−1 = 1. (元素a+(−b) a·b^−1也表示为a− 换句话说,减法和除法运算是存在的

这对编程来说意味着什么?我当然不能在Python中使用
列表
对象的加法求逆(我可以直接销毁该对象,但这就像乘法求逆一样。我想你可以尝试定义Python环,但最终不会成功)。甚至不要考虑划分
列表

至于代码可读性,我完全不知道如何应用它,所以这个应用程序是不相关的


这是我的解释,但作为一名数学专业的学生,可能会让我对不同领域的其他术语视而不见(你知道我在说哪一个)。

在函数式编程中,尤其是在Haskell中,构造将状态转换为单子的程序是很常见的。这样做意味着您可以在非常不同的程序中重用monad上的通用算法

C++标准模板库的概念是:其思想是泛型算法可能需要一个操作来满足幺半群公理的正确性


例如,如果我们可以证明我们正在操作的类型T(数字、字符串等)在该操作下是闭合的,我们就知道不必检查某些错误;我们总是能得到一个有效的T。如果我们可以证明该操作是关联的
(x*(y*z)=(x*y)*z)
,那么我们可以重用fork-join架构;这是一种在各种库中实现的简单但并行编程方法。

计算机科学现在似乎有很多相似之处。你可以得到单子、幺半群、函子——一整套数学实体,它们被用来提高代码的可重用性,利用抽象数学的抽象。

列表是带有一个生成器的自由幺半群,二叉树是组。你有有限变量或无限变量

起点:

您可能想学习范畴理论,以及范畴理论接近代数结构的方式:它正是函数式编程语言接近数据结构的方式,至少是形状

示例:类型树A为

Tree A = () | Tree A | Tree A * Tree A
这意味着同构(*)的存在(我设置了
G=treea

这与组结构相同

phi : 1 + G + G x G -> G
() € 1         -> e
x € G          -> x^(-1)
(x, y) € G x G -> x * y
实际上,二叉树可以表示表达式,它们形成了一个代数结构。G的一个元素读作恒等式、元素的逆式或两个元素的乘积。二叉树可以是一片叶子、一棵树或一对树。注意形状上的相似性


(*)以及一个通用属性,但它们是其中的两个(有限树或无限懒树),因此我不会详细讨论。

与数学思维相比,数学知识并没有真正起到帮助作用。抽象是编程的关键。将真实的概念转化为数字和关系是我们每天都在做的事情。代数是一切之母,代数是定义正确性的一套规则,它是最高层次的抽象,因此,理解代数意味着你可以思考得更清楚、更快、更有效。从集合论到范畴论、领域论等,一切都来自于实际挑战、抽象和泛化需求。
在通常的实践中,你不需要真正了解这些,尽管如果你想开发像AI代理、编程语言、基本概念和工具这样的东西,那么它们是必须的。

幺半群在编程中无处不在。在一些编程语言中,例如Haskell,我们可以使幺半群显式化

那么那些孤独的同构呢?还有谁会想到(然后“等等,我该向谁建议呢?我几乎不懂编程概念,更不用说它背后的数学知识了——我甚至不知道它是否被正确地称为‘单子’)“怎么回事……编程?”:代数结构定义是具有特定类型的函数。对于幺半群,它是来自
()|G*G->G
的函数,即返回单位元素或乘法的函数。这非常类似于以二叉树形式计算表达式的函数,不是吗?实际上,二叉树和幺半群是相似的概念。这就是为什么我们在函数式编程中有代数数据类型这个术语。嘿,这表明我的书包里没有多少计算机科学。我必须更多地研究二叉树和那些幺半群的东西。谢谢你的信息!除了,树不是关联的,是吗?(不幸的是,我并不真正了解范畴理论,所以我不知道它是如何看待这些事情的…@comingstorm:说得好。对于组,有一个交换图,描述了
phi
应用程序在关联性方面的行为。如果您想将其转换为树,您将编写一个谓词,告诉您两棵树何时相等。树代表前
phi : 1 + G + G x G -> G
() € 1         -> e
x € G          -> x^(-1)
(x, y) € G x G -> x * y