首页 > 解决方案 > sum 和 product 之外是否有代数数据类型?

问题描述

根据大多数定义,Haskell 或 Scala 中常见或基本的代数数据类型是 sum 和 product。示例:12

有时,为了简单起见,定义只是说代数数据类型是 sum 和 product

然而,这些定义给人的印象是其他代数数据类型也是可能的,而 sum 和 product 只是描述元素选择或组合的最有用的方法。

鉴于在基本代数中有减法,除法,提升到整数幂运算 - 在编程中其他替代代数类型的某些实现是否正确,但它们没有用?

是否有任何编程语言实现了不是 sum 和 product 类型的代数数据类型?

标签: scalahaskelltypesalgebraic-data-types

解决方案


“代数”来自范畴论。每个代数数据类型都是函子的初始代数。因此,您原则上可以以这种方式将来自函子的任何事物称为代数,我认为这是一个相当大的类。

正如你所说,将“代数”解释为“高中代数”(我并不是要居高临下,这就是我们所说的),有一些很好的类比。

  • 任意幂,而不仅仅是整数幂,与函数类型非常相似,也就是说, A -> B类似于. 在范畴论中,当您将函数(“态射”)视为范畴的对象时,它被称为指数对象,并且使用后一种表示法。为了好玩,看看你是否可以通过在相应类型之间写一个双射来证明这个定律。BACA+B = CA × CB
  • 除法类似于商类型,这是一个引人入胜的研究领域,涉及同伦类型理论等热门和流行的事物。商与除法的类比不如乘法的产品类型强,因为您必须除以等价关系。
  • 按照这个速度,你会期望减法有一些漂亮的类比,但可惜我不知道。Dan Piponi 通过antidiagonal对它进行了一些探索,但它远非一般的类比。

推荐阅读