scala - sum 和 product 之外是否有代数数据类型?
问题描述
根据大多数定义,Haskell 或 Scala 中常见或基本的代数数据类型是 sum 和 product。示例:1、2。
有时,为了简单起见,定义只是说代数数据类型是 sum 和 product。
然而,这些定义给人的印象是其他代数数据类型也是可能的,而 sum 和 product 只是描述元素选择或组合的最有用的方法。
鉴于在基本代数中有减法,除法,提升到整数幂运算 - 在编程中其他替代代数类型的某些实现是否正确,但它们没有用?
是否有任何编程语言实现了不是 sum 和 product 类型的代数数据类型?
解决方案
“代数”来自范畴论。每个代数数据类型都是函子的初始代数。因此,您原则上可以以这种方式将来自函子的任何事物称为代数,我认为这是一个相当大的类。
正如你所说,将“代数”解释为“高中代数”(我并不是要居高临下,这就是我们所说的),有一些很好的类比。
- 任意幂,而不仅仅是整数幂,与函数类型非常相似,也就是说,
A -> B
类似于. 在范畴论中,当您将函数(“态射”)视为范畴的对象时,它被称为指数对象,并且使用后一种表示法。为了好玩,看看你是否可以通过在相应类型之间写一个双射来证明这个定律。BA
CA+B = CA × CB
- 除法类似于商类型,这是一个引人入胜的研究领域,涉及同伦类型理论等热门和流行的事物。商与除法的类比不如乘法的产品类型强,因为您必须除以等价关系。
- 按照这个速度,你会期望减法有一些漂亮的类比,但可惜我不知道。Dan Piponi 通过antidiagonal对它进行了一些探索,但它远非一般的类比。
推荐阅读
- r - 三向列联表 gtsummary
- javascript - 如何显示从一个公共点开始的数据
- spring-boot - Springboot反序列化“>”符号为>和“<”为<
- youtube - Youtube-dl 仅选择主要发行艺术家和年份并添加自定义元数据
- javascript - Vue 3 - “无法解析组件”警告
- c++ - 为什么这个 C++ 程序会导致一些未知测试用例的错误输出,我无法调试?
- azure-functions - Function App(高级)访问限制和 NSG 出站规则
- javascript - 如何创建可用于不同文件的通用搜索功能
- javascript - 尽管采取了非常相似的方法,为什么我会得到一个无限循环?
- javascript - 以最有效的方式从给定字符串中删除单词数组