【发布时间】:2016-09-03 17:19:41
【问题描述】:
我想用 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,而是使用structs 和PhantomData(example 1,@ 987654322@).
我的实现有问题吗?这是因为Zero 和Succ 是enum 变体而不是真正的类型(所以我的实现不是实际的类型算术)?或者如果我扩展我的实现会出现困难,是否最好以“主流”方式执行此操作?
编辑:我在使用 structs 实现 Peano 数字时遇到的困难可以在 here 中看到。
【问题讨论】:
标签: functional-programming rust peano-numbers