代数结构和编程

时间:2011-01-19 20:16:14

标签: math mathematical-optimization reusability

任何人都可以举个例子说明如何使用代数结构(如组,幺半群和环)来提高代码的可重用性? (或者我如何在编程中利用这些结构,至少知道我没有在高中学习所有这些理论)。

我听说这是可能的,但我无法想出在编程中应用它们并在编程中应用核心数学的方法。

6 个答案:

答案 0 :(得分:1)

数学思维并不是数学上的东西。抽象是编程的关键。将真实的概念转化为数字和关系是我们每天都在做的事情。代数是所有人的母亲,代数是定义正确性的一套规则,它是最高级别的抽象,因此,理解代数意味着你可以更清晰,更快速,更有效地思考。从集合论到范畴论,域论等,一切都来自实际挑战,抽象和泛化要求。 在通常的实践中,您不需要真正了解这些,但如果您正在考虑开发诸如AI代理,编程语言,基本概念和工具之类的东西,那么它们是必须的。

答案 1 :(得分:0)

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


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

  

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

这对编程意味着什么?我肯定不能在Python中有list对象的加法逆(好吧,我可以破坏对象,但这就像乘法逆。我想你可以到达某个地方试图定义一个Python环,但它最终无法解决)。甚至认为关于划分lists ...

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

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

答案 2 :(得分:0)

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

C ++标准模板库具有monoid的概念。我们的想法是,通用算法可能需要一个操作来满足幺半群的公理正确性。

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

答案 3 :(得分:0)

如今,计算机科学似乎从category theory中获得了大量的成功。你得到monad,monoids,functors - 一个完整的数学实体动物,用于提高代码的可重用性,利用抽象数学的抽象。

答案 4 :(得分:0)

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

起点:

您可能希望学习类别理论,以及类别理论如何处理代数结构:它正是函数式编程语言至少采用数字结构的方式。

示例:树A的类型是

Tree A = () | Tree A | Tree A * Tree A

读作同构的存在(*)(我设置G = Tree A

1 + G + G x G -> G

与组结构相同

phi : 1 + G + G x G -> G
() € 1         -> e
x € G          -> x^(-1)
(x, y) € G x G -> x * y

实际上,二叉树可以表示表达式,它们形成代数结构。 G的元素读作标识,元素的反转或两个元素的乘积。二叉树是叶子,单个树或一对树。注意形状的相似性。

(*)以及一个通用属性,但它们是两个(有限树或无限懒树),所以我不会详细介绍。

答案 5 :(得分:0)

Monoids在编程中无处不在。在某些编程语言中,例如。 Haskell,我们可以使monoid明确http://blog.sigfpe.com/2009/01/haskell-monoids-and-their-uses.html