我听过很多人在函数式编程中谈论代数数据类型(不要与“抽象数据类型”混淆)。我所知道的是,ADT指的是某种复合(通常是递归的)数据类型,如树或数学表达式。
在wikipedia中,它只是说:
代数数据类型是一种复合类型,即类型 通过结合其他类型形成。两种常见的代数类型 也是产品类型(即元组和记录)和总和类型 称为标记或不相交的联合或变体类型。
但没有给出正式的定义。
所以我想知道ADT的定义究竟是什么?根据维基百科,产品类型和总和类型是ADT的两个例子,但是产品和总和是定义ADT的唯一有效操作吗?是否还允许其他操作?
答案 0 :(得分:4)
代数数据类型是复合类型,即由其他类型的组合形成的类型,通常分为两类:求和和乘积。
例如:
货币=美元+欧元+英镑
金钱=金额*货币
读取此内容的方法是按OR转换和,并按AND转换乘积。
产品是通常可以使用任何编程语言(无论是否具有功能)创建的类型,例如Kotlin,Java,C#,Swift中的Struct或C#等。
用AND读取组成它们的部分。
金钱=金额*货币
之所以将它们称为乘积,是因为它们可以具有的可能值数量是组成部件的可能值数量的乘积。
和类型是代数数据的一种,也称为区分联合或不联合联合,传统上仅在诸如Scala或Haskell之类的语言中具有直接支持。
组成求和类型的部分将读为OR,因为结果对象的值只能包含一个选项。
货币=美元+欧元+英镑
在这种情况下,货币值只能是USD或EUR或GBP。
之所以称为sum,是因为可以具有的可能值的数量是:组成它的部分的可能值的数量之和。
这是我博客的链接(西班牙语),在该博客上,我有一篇关于kotlin示例的更完整文章: http://xurxodev.com/tipos-de-datos-algebraicos/
答案 1 :(得分:3)
Scala 3将更好地支持代数数据类型。请参见以下幻灯片:https://www.slideshare.net/pjschwarz/scala-3-by-example-algebraic-data-types-for-domain-driven-design-part-1(下载以获得完美的图像质量)。