我想在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
和PhantomData
(example 1,example 2)来实现。我的执行方式有问题吗?这是因为
Zero
和Succ
是enum
的变体,而不是真实的类型(所以我的实现不是实际的类型算术)?还是最好以“主流”方式执行此操作,因为如果我扩展实现可能会遇到困难?编辑:我使用
struct
实现Peano数的努力可以从here中看出。 最佳答案
您的Peano数字处于值的级别,该值在程序运行时用于计算。这很适合玩耍,但不是很有用,因为像i32
这样的二进制数字效率更高。
其他实现在类型级别上表示Peano数字,您目前无法在其中使用普通数字。这允许表达依赖于数字的类型,例如固定大小的数组。然后在编译器推断类型时进行计算。