Rust 中的 Peano 数
Peano numbers in Rust
我想用 Rust 编写一个简单的 Peano 数字实现,看来我设法让基础工作起来:
use self::Peano::*;
use std::ops::Add;
#[derive(Debug, PartialEq)]
enum Peano {
Zero,
Succ(Box<Peano>)
}
impl Add for Peano {
type Output = Peano;
fn add(self, other: Peano) -> Peano {
match other {
Zero => self,
Succ(x) => Succ(Box::new(self + *x))
}
}
}
fn main() {
assert_eq!(Zero + Zero, Zero);
assert_eq!(Succ(Box::new(Zero)) + Zero, Succ(Box::new(Zero)));
assert_eq!(Zero + Succ(Box::new(Zero)), Succ(Box::new(Zero)));
assert_eq!(Succ(Box::new(Zero)) + Succ(Box::new(Zero)), Succ(Box::new(Succ(Box::new(Zero)))));
assert_eq!(Succ(Box::new(Zero)) + Zero + Succ(Box::new(Zero)), Succ(Box::new(Succ(Box::new(Zero)))));
}
然而,当我决定看看其他人是如何实现它时,我发现没有人决定使用 enum
,而是使用 struct
s 和 [=13] =] (example 1, example 2).
我的实现有问题吗?这是因为 Zero
和 Succ
是 enum
变体而不是真正的类型(所以我的实现不是实际的类型算术)?或者,如果我扩展我的实施会出现困难,那么以 "mainstream" 方式执行此操作是否更可取?
编辑: 可以看到我在使用 struct
s 实现 Peano 数方面遇到的困难 。
你的皮亚诺数是数值级别的,在程序运行时用于计算。这很适合玩,但不是很有用,因为像 i32
这样的二进制数效率更高。
其他实现在类型级别表示 Peano 数字,您目前不能在其中使用普通数字。这允许表达依赖于数字的类型,例如固定大小的数组。然后在编译器推断类型时进行计算。
我想用 Rust 编写一个简单的 Peano 数字实现,看来我设法让基础工作起来:
use self::Peano::*;
use std::ops::Add;
#[derive(Debug, PartialEq)]
enum Peano {
Zero,
Succ(Box<Peano>)
}
impl Add for Peano {
type Output = Peano;
fn add(self, other: Peano) -> Peano {
match other {
Zero => self,
Succ(x) => Succ(Box::new(self + *x))
}
}
}
fn main() {
assert_eq!(Zero + Zero, Zero);
assert_eq!(Succ(Box::new(Zero)) + Zero, Succ(Box::new(Zero)));
assert_eq!(Zero + Succ(Box::new(Zero)), Succ(Box::new(Zero)));
assert_eq!(Succ(Box::new(Zero)) + Succ(Box::new(Zero)), Succ(Box::new(Succ(Box::new(Zero)))));
assert_eq!(Succ(Box::new(Zero)) + Zero + Succ(Box::new(Zero)), Succ(Box::new(Succ(Box::new(Zero)))));
}
然而,当我决定看看其他人是如何实现它时,我发现没有人决定使用 enum
,而是使用 struct
s 和 [=13] =] (example 1, example 2).
我的实现有问题吗?这是因为 Zero
和 Succ
是 enum
变体而不是真正的类型(所以我的实现不是实际的类型算术)?或者,如果我扩展我的实施会出现困难,那么以 "mainstream" 方式执行此操作是否更可取?
编辑: 可以看到我在使用 struct
s 实现 Peano 数方面遇到的困难
你的皮亚诺数是数值级别的,在程序运行时用于计算。这很适合玩,但不是很有用,因为像 i32
这样的二进制数效率更高。
其他实现在类型级别表示 Peano 数字,您目前不能在其中使用普通数字。这允许表达依赖于数字的类型,例如固定大小的数组。然后在编译器推断类型时进行计算。