除了 sum 和 product 之外还有代数数据类型吗?

Evg*_*eny 7 haskell types scala algebraic-data-types

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

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

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

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

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

luq*_*qui 15

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

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

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

  • 我猜 `(A + B)^C = A^C × B^C` 是不正确的。你的意思是“(A × B)^C = A^C × B^C”吗? (4认同)