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

2024-04-08

我听到人们在函数式编程中谈论了很多代数数据类型(不要与“抽象数据类型”混淆)。我所知道的是,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(使用前将#替换为@)

什么是代数数据类型 (ADT)? 的相关文章

  • Java - 将字符串(4 个字符)转换为 int 并返回的乐趣

    请不要问为什么 但我必须将字符串 最多 4 个字符 存储在整数值 因此 4 个字节 中 首先我写了这个并且它有效 String value AAA int sum IntStream range 0 value length limit 4
  • 用于提前退出循环的功能代码

    如何以函数式风格重构此代码 scala 惯用 def findFirst T objects List T T for obj lt objects if expensiveFunc obj null return obj null asI
  • Scala - 以函数方式修改字符串

    我刚刚开始使用 Scala 因此开始以更实用的方式做事 只是想知道是否有一种更实用的方法来实现如下所示的功能 def expand exp String String var result exp for k v lt libMap res
  • 如何将字符串分割成等长的子串?

    我正在寻找一个elegant way in Scala http www scala lang org 将给定字符串拆分为固定大小的子字符串 序列中的最后一个字符串可能更短 So split Thequickbrownfoxjumps 4
  • 在 Haskell 中的列表上编写递归函数

    我有以下问题 定义函数 and or Bool gt Bool 它给出了布尔值列表的合取和析取 例如 and False True False or False True True 在空列表上and gives True and or gi
  • 懒惰的 juxt 函数有什么优点吗?

    在回答中一个问题 https stackoverflow com questions 10044254 is there a reverse map function关于一个使用相同参数映射多个函数的函数 A juxt 我想出了一个基本上采
  • 计算函数合理性的算法/蒙特卡罗方法

    我正在编写一个程序 尝试复制本文开头讨论的算法 http www stat stanford edu cgates PERSI papers MCMCRev pdf http www stat stanford edu cgates PER
  • 为什么不是 (20 >) 。长度 。取 10 === const True

    tl dr 事实难道不是这样吗20 lt length take 10 whatever需要whatever成功地对列表进行模式修补 至少 or 缺乏 懒惰 或者 换句话说 为什么不 20 gt length take 10 const T
  • 不可变数据结构性能

    我不明白作为一个集合的东西怎么可能是不可变的并且仍然具有可接受的性能 根据我在 F Sets 中读到的内容 内部使用红黑树作为其实现 如果每次我们想要向红黑树添加新内容时 我们基本上都必须重新创建它 那么它如何才能具有良好的性能呢 我在这里
  • 在 Scala 中的 List[Either] 上使用 flatMap

    Either从 Scala 2 12 开始是右偏的 这使得它可以在 for yield 块中使用 而无需投影 就像Option 但显然这还不足以表现得像Option当与flatMap object Main def main args Ar
  • 在 F# 中组合谓词

    F 中是否有逻辑组合谓词的标准方法 例如 假设我有isCar x and isBlue x然后我想要一些能给我的东西 let isBlueCar x isCar x isBlue x 但是使用某种组合而不是调用 可能像 let isBlue
  • 是否可以有效地计算 lambda 演算项?

    我最近用 lambda 演算编写了很多程序 我希望能够实时运行其中一些程序 然而 尽管趋势函数范式基于 lambda 演算和 B 约简规则 但我找不到一个不是玩具 不以效率为目的的评估器 函数式语言应该很快 但我所知道的那些语言实际上并不提
  • 功能段落

    抱歉 我还不太明白 FP 我想将一系列行分割成一系列行序列 假设一个空行作为段落划分 我可以在 python 中这样做 如下所示 def get paraghraps lines paragraphs paragraph for line
  • 寻找一种重构 D3.js 风格的方法链接模式的方法

    在学习 D3 js 时 我遇到了博客文章 http bost ocks org mike chart 解释其可重用代码单元背后的主要设计模式 我复制了下面的相关代码 下面呈现的模式的方式正是在 D3 代码库和插件中使用的方式 example
  • 计算 python 字典/数组数据结构的非空尾叶 - 递归算法?

    我正在寻找一个函数来查找一种复杂字典 数组结构的所有非空端点 我认为因为我不知道嵌套数组的数量或它们的位置 所以它必须是递归的 而我只是还没有完全理解这种思维方式 所以对于嵌套字典 x top middle nested value nes
  • 如何使用 swift flatMap 从数组中过滤掉选项

    我对 flatMap 有点困惑 添加到 Swift 1 2 假设我有一些可选类型的数组 例如 let possibles Int nil 1 2 3 nil nil 4 5 在 Swift 1 1 中 我会做一个过滤器 然后是一个像这样的地
  • 如何在 Haskell 中获得列表的中间位置?

    我刚刚开始使用 Haskel 学习函数式编程 我正在慢慢度过Erik Meijer 在 Channel 9 的讲座 http channel9 msdn com shows Going Deep Lecture Series Erik Me
  • “foop”:命名约定?它是“foo”的辅助递归函数;后缀“p”是什么意思?

    我遇到了以下代码片段 函数定义 choose x xs choosep x xs where choosep x x choosep x x choosep x xs choosep x xs in 柯里编程语言 http en wikip
  • 是否可以只迭代一个流一次并执行 2 个或更多操作?

    给定代码 List
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频

随机推荐