我听到人们在函数式编程中谈论了很多代数数据类型(不要与“抽象数据类型”混淆)。我所知道的是,ADT 指的是某种复合(通常是递归)数据类型,例如树或数学表达式。
In 维基百科 https://en.wikipedia.org/wiki/Algebraic_data_type,只是说:
代数数据类型是一种复合类型,即类型
由其他类型组合而成。两类常见的代数类型
是乘积类型(即元组和记录)和总和类型(即
标记或不相交的并集,或variant types).
但没有给出正式的定义。
所以我想知道ADT的定义到底是什么?根据维基百科,乘积类型和求和类型是 ADT 的两个示例,但是乘积和求和是定义 ADT 的唯一有效操作吗?是否还有其他允许的操作?
代数数据类型是复合类型,即由其他类型组合而成的类型,通常分为两类:和和乘积。
例如:
货币 = 美元 + 欧元 + 英镑
金额 = 金额 * 币种
阅读此内容的方法是将和转换为 OR,将乘积转换为 AND。
Product
产品是一种通常可以用任何编程语言创建的类型,无论是否是函数式的,例如 Kotlin、Java、C# 中的类、Swift 或 C# 中的 Struct 等。
它们组成的部分用 AND 读取。
金额 = 金额 * 币种
它们被称为产品,因为它们可以具有的可能值的数量是其组成部分的可能值的数量的乘积。
Sum
和类型是一种代数数据类型,也称为可区分联合或不相交联合,传统上仅在 Scala 或 Haskell 等语言中直接支持。
sum 类型的组成部分被读取为 OR,因为结果对象的值只能包含选项之一。
货币 = 美元 + 欧元 + 英镑
在这种情况下,货币值只能是美元、欧元或英镑。
它们被称为总和,因为可能的值的数量是:组成它的部分的可能值的数量之和。
这是我的博客(西班牙语)的链接,其中有一篇更完整的文章,其中包含 kotlin 示例:http://xurxodev.com/tipos-de-datos-algebraicos/ http://xurxodev.com/tipos-de-datos-algebraicos/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)