Rust的Peano数字

时间:2016-09-03 17:19:42

标签: functional-programming rust peano-numbers

我想在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,而是使用structPhantomDataexample 1example 2)。

我的实施有问题吗?这是因为ZeroSuccenum变种而不是真正的类型(所以我的实现不是实际的类型算术)?或者只是做这个主流&#34;因为如果我扩展我的实施会出现什么困难?

修改:我可以看到here使用struct实施Peano数字的困难。

1 个答案:

答案 0 :(得分:9)

您的Peano数字位于值的级别,在程序运行时用于计算。这对于游戏很好但不是很有用,因为像i32这样的二进制数字效率更高。

其他实现代表类型级别的Peano数字,您目前无法使用普通数字。这允许表达依赖于数字的类型,例如固定大小的数组。然后在编译器推断类型时进行计算。