为什么“代数数据类型”在名称中使用“代数”?

2023-11-23

当我学习 Scala/Haskell 时,我看到有一个概念代数数据类型。我已经阅读了维基百科的解释,但我仍然有一个问题:

为什么它的名称中使用“代数”一词?它和“代数”有什么关系吗?


简而言之,我们必须考虑代数和类型之间的关系。 Haskell 的代数数据类型之所以如此命名,是因为它们对应于范畴论中的初始代数。

维基百科说:

在计算机编程中,特别是函数式编程和类型编程 理论上,代数数据类型是一种复合类型,即 由其他类型组合而成的类型。

让我们来Maybe a数据类型:

data Maybe a = Nothing | Just a

Maybe a表明它可能包含某种类型a - Just Int例如,也可以为空 -Nothing。在 Haskell 中,类型是对象,例如Int。例如,运算符获取类型并生成新类型Maybe Int. Algebraic指代数数据类型创建的属性algebraic运营:sums and product where:

  • “sum”是交替(A | B,意思是A或B但不是两者)
  • “产品”是组合(A B,意思是A和B在一起)

例如,让我们看看sum for Maybe a。首先我们定义Add type:

data Add a b = Left a | Right b

在哈斯克尔| is or,所以它可以是或Left a or Right b。竖条|向我们表明Maybe我们上面定义的是一个 sum 类型,这意味着我们可以这样写Add:

type Maybe a = Add Nothing (Just a)

Nothing这里是这里是一个unit type:

在数理逻辑和计算机科学领域称为类型 理论上,单位类型是这样的类型allows只有一个值

data Unit = Unit

Or ()在哈斯克尔。

Just a是一个单例类型。单例类型是那些只有一个值的类型。

data Just a = Just a

之后我们可以将其重写为:

type Maybe a = Add () a

所以我们有单位类型 -1,以及单例类型 -a。现在我们可以说Maybe a与 1 + a 相同。

如果你想深入——数据代数和变异演算

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么“代数数据类型”在名称中使用“代数”? 的相关文章

  • Scala 中缺少所有参数的部分应用函数

    根据我的理解 部分应用的函数是我们可以调用的函数 无需 传递所有 部分必需的参数 def add x Int y Int x y val paf add Int 3 val paf1 add Int Int 在上面的示例中 paf1 指的是
  • Play Framework Form“折叠”方法命名原理

    Play 框架 2 x 表格类 http www playframework com documentation 2 0 api scala index html play api data Form有一个方法叫做foldwho 的用法表示
  • 时间:2019-03-17 标签:c++boostlambdalibraries

    使用 boost lambda 库开始编程的最佳方法可能是什么 在 C 语言和库的范围内 我建议首先习惯使用 STL 算法函数模板进行编程 因为 boost lambda 最常见的用途之一是用内联表达式替换函子类 库文档本身为您提供了一个预
  • 不可变会占用内存吗?

    假设我们有一个内存密集型类 例如Image 使用可链接的方法 例如Resize and ConvertTo 如果这个类是不可变的 当我开始做类似的事情时 是否会占用大量内存i Resize 500 800 Rotate 90 Convert
  • 在 Dart 中将类型化函数作为参数传递

    我知道Function https api dartlang org stable 1 22 1 dart core Function class html类可以作为参数传递给另一个函数 如下所示 void doSomething Func
  • 在 Scala 中是否有更好的方法来提升 PartialFunction?

    我偶尔会遇到以下模式 我基本上有一个PartialFunction SomeType AnotherType 并希望将其视为Function SomeType Option AnotherType eg def f s SomeType O
  • 将其参数应用于自身的函数?

    考虑以下 SML 函数 fn x gt x x 这会产生以下错误 新泽西州标准 ML v110 72 stdIn 1 9 1 12 Error operator is not a function circularity operator
  • 在 Haskell 中的列表上编写递归函数

    我有以下问题 定义函数 and or Bool gt Bool 它给出了布尔值列表的合取和析取 例如 and False True False or False True True 在空列表上and gives True and or gi
  • 为什么不是 (20 >) 。长度 。取 10 === const True

    tl dr 事实难道不是这样吗20 lt length take 10 whatever需要whatever成功地对列表进行模式修补 至少 or 缺乏 懒惰 或者 换句话说 为什么不 20 gt length take 10 const T
  • 如何在 React Native ListView 中将项目居中?

    我试图在选择一个项目时将其置于水平列表视图的中心 我当前的策略是首先测量项目并滚动到视图中引用项目的 x 坐标 目前 每当我按下某个项目时ListView滚动到最后x 538 有没有更简单的方法来实现这一点 同时保持代码无状态 功能 con
  • 在 F# 中组合谓词

    F 中是否有逻辑组合谓词的标准方法 例如 假设我有isCar x and isBlue x然后我想要一些能给我的东西 let isBlueCar x isCar x isBlue x 但是使用某种组合而不是调用 可能像 let isBlue
  • Scala:抽象类型模式 A 未被选中,因为它已被擦除消除

    我正在编写只能捕获特定类型异常的函数 def myFunc A lt Exception try println Hello world or something else catch case a A gt warning abstrac
  • 阻塞事件循环

    我正在通过 Nodeschool 参加 函数式 Javascript 研讨会 其中一项练习的标题是 阻止事件循环 我很难理解它 通过过去的练习 我确保真正尝试理解解决方案 这样如果我必须重做问题 我就会理解如何解决它 而不是第一次就破解它
  • 功能段落

    抱歉 我还不太明白 FP 我想将一系列行分割成一系列行序列 假设一个空行作为段落划分 我可以在 python 中这样做 如下所示 def get paraghraps lines paragraphs paragraph for line
  • Ruby 反向柯里化:这可能吗?

    关于 Ruby 1 9 x 中的柯里化 我一直在某些地方使用它 并且可以像基本上支持 proc 参数的默认参数一样进行翻译 p proc x y z x y z p curry 1 gt returns a lambda p curry 1
  • F# 编码练习

    我一直在 Visual Studio 2010 中涉足 F 我是一名在 C 和 Java 等面向对象语言方面拥有更多代码 架构设计经验的开发人员 为了扩展我的技能并帮助做出更好的决策 我正在尝试使用不同的语言来做不同的事情 特别是掌握使用函
  • “函数是第一等值”这到底是什么意思?

    有人可以用一些很好的例子清楚地解释它吗 在解释函数式编程时 我在 Scala 中遇到了这句话 一流 并不是一个正式定义的概念 但它通常意味着一个实体具有三个属性 有可能used 不受限制 只要 普通 值可以 即从函数传递和返回 放入容器等
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • “功能性”Rust 对性能有哪些影响?

    我正在关注 Rust 轨道运动 io https exercism io 我有相当多的 C C 经验 我喜欢 Rust 的 功能 元素 但我担心相对性能 我解决了 行程编码 问题 https exercism io tracks rust
  • Haskell 入门

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

随机推荐

  • 使用 ACTION_IMAGE_CAPTURE 以较低分辨率打开 Android 相机

    我正在使用这样的意图打开 Android 相机 Intent cameraIntent new Intent android provider MediaStore ACTION IMAGE CAPTURE cameraIntent put
  • GWT 2.7 + GAE 应用程序在部署时查找代码服务器

    为什么 appengine 尝试使用超级开发模式 每次我将 GWT 应用程序部署到 appengine 并尝试访问它时 我都会看到白色的加载屏幕 然后大约 20 30 秒后我会收到以下消息 我使用 Maven 与gwt maven 插件 a
  • hibernate如何从现有数据库视图中检索数据?

    我是冬眠新手 我的问题是我有一个 Oracle 数据库 我在数据库中有一个视图 现在我想使用 hibernate 来检索该视图中的数据 有没有可能的解决方案 下面的代码片段可以解决您的问题 该代码片段是从教程中提取的 将 Hibernate
  • 为什么 Object.create(null) 的 __proto__ 未定义?

    在阅读 Javascript 原型时 我遇到了这种我无法解释的行为 我正在 chrome 的控制台 V8 中对此进行测试 var fruit taste good var banana Object create fruit console
  • 如何避免 Java 游戏中的垃圾收集延迟? (最佳实践)[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在为 Android 平台调整 Java 交互游戏的性能 有时 垃圾收集的绘图和交互会出现问题 通常它不到十分之一秒 但有时在非常慢的设备上可能会长达 200 毫秒 我正在使
  • 检查两个 Python 正则表达式模式是否等效

    我想写一个正则表达式re VERBOSE模式 但我不相信我会毫无错误地添加详细部分 我记得 理论上 两个正则表达式的等价性 至少没有反向引用 可以通过生成它们的自动机并尝试找到图双射来找到 但我看不到用于比较正则表达式的实例方法 有没有办法
  • 无法使用滚动条使 DIV 宽度为 100%

    我有一个带有 DIV 和 TABLE 的页面 DIV 是我的标题 即使显示水平滚动条 我也希望它的宽度为 100 由于某种原因 它只占用 100 的可见窗口 我的 HTML 代码是 div style background color ye
  • WCF、Web 服务或 ADO.NET 数据服务:我应该使用什么?

    对于一个项目 我必须在 Web 服务器上托管的数据库与互联网上的多个客户端之间实现通信 在阅读了一些内容并观看了一些有关可能的 微软 技术的介绍性视频后 我发现我似乎 至少 有三个选择 1 Windows 通信基础 WCF 2 ASP NE
  • 目标框架下拉列表为空

    我安装了 VS NET 2010 Premium 但在尝试针对现有 NET 框架时似乎出现问题 当我打开 Web 应用程序项目的属性时 我得到的唯一选项是安装框架 如果我打开任何其他项目类型的属性 我会得到完整列表 到目前为止 我已执行以下
  • LocalDateTime 和 SQL Server JDBC 4.2 驱动程序

    我正在尝试使用新的java time具有最新版本的 Sql Server JDBC 驱动程序的类 据我所知 它应该只适用于方法 PreparedStatement setObject and ResultSet getObject 所以我创
  • 如何使用 StoryBoard 在 iPad 上的 Popover 内显示 UIDatePicker?

    我已经实现了在弹出窗口中显示日期选择器 以编程方式执行此操作 如下所示UIPopover 中的 UIDatePicker 但我一直在尝试在界面生成器中执行此操作 我已经制作了一个名为 DatePickerViewController m 的
  • 在 android 中使用 handler 和 postDelayed 暂停

    我对 Android 编程很陌生 所以请原谅我的新手 我正在尝试创建一个非常简单的活动 该活动将在布局中间有一个 TextView 并且每隔几秒切换到不同的文本 例如 TextView 会说 text1 暂停几秒钟 然后说 text2 然后
  • Facebook graph api 照片上传到粉丝页面相册

    我已经获得了使用此代码的照片上传功能
  • Hadoop 作业失败,资源管理器无法识别 AttemptED

    我正在尝试在 Oozie 工作流程中聚合一些数据 但是聚合步骤失败 我在日志中发现了两个有趣的点 第一个是一个似乎重复出现的错误 容器完成后 它会被终止 但会以非零退出代码 143 退出 它完成了 2015 05 04 15 35 12 0
  • .NET - 从代码设置电源选项

    我想用 C 编写非常简单的代码 一个简单的 2 按钮应用程序 它允许我更改盖子关闭时所采取的操作 从 睡觉 到 不行动 反之亦然 我发现它以某种方式连接到 WMI 但没有关于如何实现这一点的实际信息 非常感谢您的帮助 Thanks 这是一篇
  • 正则表达式 - 前瞻断言

    我在前瞻断言 方面遇到问题 例如我有这样的表达 Win 2000 它匹配Win 如果表达式是这样的Win2000 Win2000fgF 我有下一个表达 d a z 它匹配数字和小写字母 例如 45dF 4Dd 但我不知道 为什么它有效并匹配
  • ServerManager 如何获取站点在磁盘上的物理路径?

    如何获取磁盘上站点的物理路径 using ServerManager serverManager new ServerManager var sites serverManager Sites foreach Site site in si
  • 目前最好的垃圾邮件过滤算法

    目前检测垃圾邮件的最佳方法是什么 尤其是手机短信 有资源或者比较分析吗 研究监督学习技术是件好事 多项研究表明 多项式朴素贝叶斯分类器已被用于垃圾邮件过滤 并取得了巨大成功 如果它适用于垃圾邮件过滤 那么它也应该适用于短信过滤 您需要的是一
  • Flutter - 错误:没有为该类定义 getter X

    我有课TripController包含私有字段 updatedAccount 我创建了一个吸气剂以便从外部获取 class TripController final String accountId final BuildContext c
  • 为什么“代数数据类型”在名称中使用“代数”?

    当我学习 Scala Haskell 时 我看到有一个概念代数数据类型 我已经阅读了维基百科的解释 但我仍然有一个问题 为什么它的名称中使用 代数 一词 它和 代数 有什么关系吗 简而言之 我们必须考虑代数和类型之间的关系 Haskell