【问题标题】:Peano numbers in RustRust 中的 Peano 数字
【发布时间】: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 和PhantomDataexample 1,@ 987654322@).

我的实现有问题吗?这是因为ZeroSuccenum 变体而不是真正的类型(所以我的实现不是实际的类型算术)?或者如果我扩展我的实现会出现困难,是否最好以“主流”方式执行此操作?

编辑:我在使用 structs 实现 Peano 数字时遇到的困难可以在 here 中看到。

【问题讨论】:

    标签: functional-programming rust peano-numbers


    【解决方案1】:

    您的 Peano 数字处于值级别,在程序运行时用于计算。这很适合玩耍,但不是很有用,因为像i32 这样的二进制数字效率更高。

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

    【讨论】:

    • 看来我最初的猜测是准确的。您能否提供更多详细信息,说明为什么效率较低以及二进制数在其他实现中的位置?在 LLVM 阶段之后这是否会变慢,在 LLVM 阶段,枚举被转换为不同于结构的东西?
    • @ljedrz 类型级别的 Peano 数字也不用二进制表示,它们同样低效。在可能没问题的类型空间中(数字通常更小,Peano 数字更容易实现 --- 尽管请参阅typenum 了解二进制类型级别的数字)但对于值,实际使用它们很愚蠢。
    • 我理解并且我不打算在现实生活中使用它们,但我仍然想知道使用枚举和结构来实现它们之间的低级区别。
    • @ljedrz 例如,二进制数是i32 类型的数字(如果您不想限制它们的大小,也可以是bigint)。
    • @ljedrz 计算你的数字是在程序运行时完成的,而类型级数字的计算是在编译期间推断类型时完成的。所以它们是完全不同的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多