如何证明 Rust 类型系统支持代数数据类型(ADT)?

Che*_*evy 10 algebraic-data-types rust

维基百科的具有代数数据类型 (ADT) 的编程语言列表表明 Rust 确实具有 ADT,但我不确定我对 Rust 为何如此的解释是否正确。据我了解,要说一个人拥有 ADT,需要具备:

价值观

  • 零(或 Void) -!在 Rust 中) - 没有值的类型。
  • One(或 Unit)——()在 Rust 中)——一种获得一个值的类型:()它本身。

运营

  • Rust 中的加法enum { A, B }运算可以返回 的值A或 的值B
  • 乘法 - Rust 中的元组- 可以返回和(A, B)的所有组合的运算。AB

规则

  • a + b = b + aenum { A, B } =~ enum { B, A }
  • a * b = b * a(A, B) =~ (B, A)
  • 0 + x = xenum { !, A } =~ enum { A }
  • 0 * x = 0(!, A) =~ !
  • 1 * x = x((), A) =~ A

这里的A =~ B意思是有一个fn(A) -> Bandfn(B) -> A

我上面关于为什么 Rust 的类型系统支持 ADT 的描述是正确的,还是我遗漏或误解了一些内容?

Pet*_*all 3

我上面关于为什么 Rust 的类型系统支持 ADT 的描述是正确的,还是我遗漏或误解了一些内容?

是的,这大约是正确的。我要做的一项更改是将Void其表达为enum. 正如 interjay 在评论中所说,还不!是稳定 Rust 的一部分:

enum Void {} // uninhabited
Run Code Online (Sandbox Code Playgroud)

其余的很容易理解,我不确定答案是否能比你在问题中所做的更好地表达它。