Functional programming 什么是代数数据类型(ADT)?

Functional programming 什么是代数数据类型(ADT)?,functional-programming,algebraic-data-types,Functional Programming,Algebraic Data Types,我听过很多人在函数式编程中谈论代数数据类型(不要与“抽象数据类型”混淆)。我只知道ADT指的是某种复合(通常是递归)数据类型,如树或数学表达式 实际上,只是说: 代数数据类型是一种复合类型,即 由其他类型组合而成。两类常见的代数类型 是乘积类型(即元组和记录)和和和类型(即。 标记的或不相交的联合,或变体类型) 但没有给出正式的定义 所以我想知道ADT的确切定义是什么?根据维基百科,产品类型和总和类型是ADT的两个示例,但是产品和总和是定义ADT的唯一有效操作吗?还有其他允许的操作吗?代数数据类

我听过很多人在函数式编程中谈论代数数据类型(不要与“抽象数据类型”混淆)。我只知道ADT指的是某种复合(通常是递归)数据类型,如树或数学表达式

实际上,只是说:

代数数据类型是一种复合类型,即 由其他类型组合而成。两类常见的代数类型 是乘积类型(即元组和记录)和和和类型(即。 标记的或不相交的联合,或变体类型)

但没有给出正式的定义


所以我想知道ADT的确切定义是什么?根据维基百科,产品类型和总和类型是ADT的两个示例,但是产品和总和是定义ADT的唯一有效操作吗?还有其他允许的操作吗?

代数数据类型是复合类型,即由其他类型组合而成的类型,通常分为两类:和和和积

例如:

货币=美元+欧元+英镑
货币=金额*货币

阅读这篇文章的方法是用OR来翻译和,用and来翻译乘积

产品 产品是一种通常可以用任何编程语言创建的类型,无论是否是函数式的,例如Kotlin、Java、C#中的类、Swift中的Struct或C#中的类等

它们的组成部分用和来阅读

货币=金额*货币

它们被称为产品,因为它们可以拥有的可能值的数量是组件可能值的数量的乘积

总和 和类型是一种代数数据类型,也称为判别并集或不相交并集,传统上在Scala或Haskell等语言中只提供直接支持

构成总和类型的部分被读取为或,因为结果对象的值只能包含其中一个选项

货币=美元+欧元+英镑

在这种情况下,货币价值只能是美元、欧元或英镑

它们被称为sum,因为可能具有的值的数量是:组成它的部分的可能值的数量之和

这是我的博客(西班牙语)的链接,在这里我有一篇更完整的文章,其中有kotlin的例子:
Scala 3将更好地支持代数数据类型。请参阅此幻灯片:(下载以获得完美的图像质量)


@OliverCharlesworth感谢您提供的链接,我在提问之前已经阅读了该页面,但该页面并未给出正式定义。它们是服从代数的数据类型,即一组将它们组合起来的操作以及这些操作所遵循的一组定律。维基百科的定义提到了两个这样的操作:乘积类型和求和类型。例如,函数表示幂运算,拉链对应于导数。这些定律就像你在高中代数中学到的。结合性、交换性、分配性等。