为什么"代数数据类型"在名称中使用"代数"?

Fre*_*ind 5 functional-programming algebraic-data-types

当我学习Scala/Haskell时,我发现有一个代数数据类型的概念.我已经阅读了维基百科的解释,但我还是有一个问题:

为什么它的名字中使用"代数"这个词?它与"代数"有什么关系吗?

0xA*_*xAX 4

简而言之,我们必须考虑代数和类型之间的关系。Haskell 的代数数据类型之所以如此命名,是因为它们对应于范畴论中的初始代数。

维基百科说:

在计算机编程中,特别是函数式编程和类型论中,代数数据类型是一种复合类型,即通过组合其他类型形成的类型。

让我们采用Maybe a数据类型:

data Maybe a = Nothing | Just a
Run Code Online (Sandbox Code Playgroud)

Maybe a表示它可能包含某种类型a-Just Int例如,但也可以为空 - Nothing。在 Haskell 中,类型是对象,例如Int. 运算符获取类型并生成新类型,例如Maybe IntAlgebraic指代数数据类型由以下操作创建的属性algebraicsums并且product其中:

  • “sum”是交替(A | B,意思是A或B但不是两者)
  • “产品”是组合(AB,意思是A和B在一起)

例如,让我们sum看看Maybe a. 首先让我们定义Add类型:

data Add a b = Left a | Right b
Run Code Online (Sandbox Code Playgroud)

在 Haskell 中|or,所以它可以是 orLeft aRight b。竖线向|我们展示了Maybe上面定义的 sum 类型,这意味着我们可以这样写Add

type Maybe a = Add Nothing (Just a)
Run Code Online (Sandbox Code Playgroud)

Nothing这是一种unit类型:

在数理逻辑和计算机科学领域(称为类型论)中,单位类型是一种只允许一个值的类型

data Unit = Unit
Run Code Online (Sandbox Code Playgroud)

或者()在哈斯克尔。

Just a是一个单例类型。单例类型是那些只有一个值的类型。

data Just a = Just a
Run Code Online (Sandbox Code Playgroud)

之后我们可以将其重写为:

type Maybe a = Add () a
Run Code Online (Sandbox Code Playgroud)

所以我们有单位类型 -1和单例类型 - a。现在我们可以说它Maybe a与 1 + a 相同。

如果你想深入了解 -数据代数和变异微积分