#numbers #typenum #implemented #faster #system #programming #type-level

peano

Rust 类型系统中实现的佩亚诺数。建议使用 typenum 以获得更快的类型级别数。

3 个稳定版本

使用旧的 Rust 2015

1.0.2 2016 年 9 月 4 日
1.0.1 2015 年 10 月 12 日

#2496Rust 模式

41 每月下载次数

MIT/Apache

16KB
206

crates.io Build Status

佩亚诺

佩亚诺是一个 Rust 类型级别数的库。它已被 typenum 取代,后者执行相同的功能(更多)且速度更快。

佩亚诺的优势在于它非常简单;整个库是一个只有不到 400 行代码的单个文件,其中很多是注释。

因此,如果您想探索类型级别编程,请看一下。如果您想导入库,请使用 typenum。


lib.rs:

佩亚诺数允许我们在编译时使用 Rust 类型系统进行算术运算。

佩亚诺数的基本思想是首先定义数字 Zero。然后,我们递归地定义其余的自然数。对于任何非负自然数 N,定义其后续者,Succ<N>,一个正数。我们现在可以计数了!

因为我们想要所有的整数而不是仅仅是自然数,所以我们必须对这些定义稍加小心,这也是为什么上面指定的 N 不能是负数的原因。否则,当我们定义前驱时,我们可能会得到 Pred<Succ<Zero>>,它应该代表数字 Zero,但它是一个不同的类型,并且编译器不会将其视为此类。

我们现在可以定义负数:对于任何非正自然数 N,定义其前驱,Pred<N>,一个负数。

根据 PredSucc 的定义,我们禁止它们一起使用。

从概念上讲,我们现在可以访问所有整数。在实际情况中,除非我们使用 #![recursion_limit="N"] lint 来增加允许的内嵌特质的数量,否则我们只能访问从 -63 到 63 的数字。

除了这里创建的特质外,特质 AddSubMulDivNeg 都为 Peano 数实现了。请注意,这些特质在这里的使用方式与典型情况有很大不同。与它们一起提供的函数根本不会被使用(如果你尝试使用它们,将会抛出错误)。相反,我们将它们用作 类型 的运算符,关联类型作为计算结果。

示例

use peano::{P2, P3, P4, ToInt};
// 2 + 3 == 5
assert_eq!( 5, <<P2 as Add<P3>>::Output as ToInt>::to_int() );

// 4 / 2 == 2
assert_eq!( 2, <<P4 as Div<P2>>::Output as ToInt>::to_int() );

注意,这里的 ToInt 特质仅用于获取整数输出;它是 Peano 数定义的唯一运行时操作,主要存在于调试目的。重要的是,通常使用的是关联类型 Output

注意:除非这些数字非常小,否则使用这些数字进行算术运算非常慢。强烈建议您使用 typenum crate。

无运行时依赖