什么是函数式编程中 ADT 的代数?

Man*_*oid 2 haskell functional-programming scala

在一本 Scala 书中,我读到了这个:

例如,此代码是一个 ADT:

sealed trait Bool 
case object True extends Bool 
case object False extends Bool
Run Code Online (Sandbox Code Playgroud)

....并且进一步说:

ADT 中的“代数”在 Haskell wiki 上是这样描述的:

“代数”是指代数数据类型由“代数”运算创建的属性。这里的“代数”是“总和”和“乘积”(类型)。

但是上面代码片段中的那些“代数”运算在哪里?

Mar*_*lic 5

但是上面代码片段中的那些“代数”运算在哪里?

它们隐含在语言的语法中。“加法”的概念运算

A + B
Run Code Online (Sandbox Code Playgroud)

可以在 Scala 中编码为

sealed trait T 
case object A extends T 
case object B extends T
Run Code Online (Sandbox Code Playgroud)

而乘法的概念运算

A x B
Run Code Online (Sandbox Code Playgroud)

可以在 Scala 中编码为

case class T(a: A, b: B)
Run Code Online (Sandbox Code Playgroud)

关于 ADT 的代数是什么

术语“代数”起源于称为抽象代数的数学领域。这是一种研究不同对象和对这些对象的不同操作并希望找到它们之间共同行为的努力。粗略地说,这是一个拿走东西并看到剩下的东西的过程。就像你小时候学习用苹果算数和算术一样。在某些时候,你“带走”了苹果,剩下的是“数字”,它们的行为方式与苹果相同。这样做的好处是,现在您在苹果算术中学到的相同规则和定律,可以推广到橙子算术及其他算术。但是数学家走得更远,提出了一些疯狂的问题,比如如果我们把数字本身拿掉会发生什么?另一种看待它的方式是你写下一些等式,比如

A + B
Run Code Online (Sandbox Code Playgroud)

其中加法+是在某种抽象意义上定义的,现在尝试找到满足它的任何类型的对象。例如,整数以及实数等都满足它,但结果证明某些类型的数据类型(如 sum 类型)也适合该等式。因此,数学家们将在某种意义上与加法运算一起工作的所有对象类集体声明为代数结构,并赋予它一些宏大的名称,如阿贝尔群等。这大致是“代数数据类型”中“代数”的词源。