Functional programming 为什么;“代数数据类型”;使用「;代数的;以他的名义?

Functional programming 为什么;“代数数据类型”;使用「;代数的;以他的名义?,functional-programming,algebraic-data-types,Functional Programming,Algebraic Data Types,当我学习Scala/Haskell时,我发现有一个概念。我已经阅读了维基百科的解释,但我仍然有一个问题: 它为什么在名称中使用“代数”一词?它与“代数”有什么关系吗? < P>在简单词中,我们必须考虑代数和类型之间的关系。Haskell的代数数据类型被命名为这样的类型,因为它们对应于范畴论中的初始代数 维基百科说: 在计算机编程中,尤其是函数式编程和类型 理论上,代数数据类型是一种复合类型,即 由其他类型组合而成的类型 让我们看一下可能是一种数据类型: data Maybe a = Nothin

当我学习Scala/Haskell时,我发现有一个概念。我已经阅读了维基百科的解释,但我仍然有一个问题:


它为什么在名称中使用“代数”一词?它与“代数”有什么关系吗?

< P>在简单词中,我们必须考虑代数和类型之间的关系。Haskell的代数数据类型被命名为这样的类型,因为它们对应于范畴论中的初始代数

维基百科说:

在计算机编程中,尤其是函数式编程和类型 理论上,代数数据类型是一种复合类型,即 由其他类型组合而成的类型

让我们看一下
可能是一种
数据类型:

data Maybe a = Nothing | Just a
可能a
表示它可能包含类型为
a
-
的内容,例如仅包含Int
,但也可以为空-
。在haskell中,类型是对象,例如
Int
。运算符获取类型并生成新类型,例如
可能是Int
<代码>代数是指通过
代数
操作创建代数数据类型的属性:
求和
乘积
,其中:

  • “和”是交替(A | B,意思是A或B,但不是两者都有)
  • “产品”是组合(A B,意思是A和B在一起)
例如,让我们看看
可能是a
sum
。首先,让我们定义
Add
类型:

data Add a b = Left a | Right b
在haskell中,
|
,因此它可以是或
左a
右b
。竖条
|
向我们展示了我们上面定义的
可能是一种求和类型,这意味着我们可以使用
添加
来编写它:

type Maybe a = Add Nothing (Just a)
这是一个
装置
类型:

data Add a b = Left a | Right b
在数理逻辑和计算机科学领域被称为类型 理论上,单位类型是只允许一个值的类型

或者haskell中的
()

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

data Just a = Just a
之后,我们可以将其改写为:

type Maybe a = Add () a
所以我们有单位类型-
1
,和单态类型-
a
。现在我们可以说a可能与1+a相同


如果你想深入-

考虑类型
Bool
。当然,这种类型可以采用两个可能值中的一个:True或False

现在考虑

data EitherBool = Left Bool | Right Bool
这种类型可以接受多少值?有4个:
左假、左真、右假、右真
。怎么样

data EitherBoolInt = Left Bool | Right Int8
左分支中有2个可能的值,右分支中有2^8。对于
EitherBoolInt
的总共2+2^8个可能值。应该很容易看出,对于任何一组构造函数和类型,这种构造将为您提供一个数据类型,其中包含一个可能值空间,即每个构造函数的可能值之和的大小。由于这个原因,它被称为和类型

考虑一下

data BoolAndInt = BAndI Bool Int8
或者干脆

type BoolAndInt = (Bool, Int)
这能带来多少价值?对于每个可能的Int8,有两个Boolandins,总计为2*2^8=2^9个总值。可能值的总数是构造函数每个字段值的乘积,因此称为乘积类型

这一思想可以进一步扩展——例如,a->b中的函数是一种指数数据类型(参见)。您甚至可以创建一个合理的数据类型派生概念。这甚至不是一个纯粹的理论概念——它是“拉链”功能结构的基础。请参见和。

相关问题:


我的答案(这里):都是关于代数理论。

我读了整个答案,但仍然不知道wy代数类型被称为aglebraic。你说的是图像集的基数,但为什么名称是这样。链接现在已失效。