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