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

时间:2017-07-08 22:49:22

标签: functional-programming algebraic-data-types

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

wikipedia中,它只是说:

  

代数数据类型是一种复合类型,即类型   通过结合其他类型形成。两种常见的代数类型   也是产品类型(即元组和记录)和总和类型   称为标记或不相交的联合或变体类型。

但没有给出正式的定义。

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

2 个答案:

答案 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(下载以获得完美的图像质量)。

enter image description here enter image description here enter image description here