3 个稳定版本
使用旧的 Rust 2015
1.0.2 | 2016 年 9 月 4 日 |
---|---|
1.0.1 | 2015 年 10 月 12 日 |
#2496 在 Rust 模式
41 每月下载次数
16KB
206 行
佩亚诺
佩亚诺是一个 Rust 类型级别数的库。它已被 typenum 取代,后者执行相同的功能(更多)且速度更快。
佩亚诺的优势在于它非常简单;整个库是一个只有不到 400 行代码的单个文件,其中很多是注释。
因此,如果您想探索类型级别编程,请看一下。如果您想导入库,请使用 typenum。
lib.rs
:
佩亚诺数允许我们在编译时使用 Rust 类型系统进行算术运算。
佩亚诺数的基本思想是首先定义数字 Zero
。然后,我们递归地定义其余的自然数。对于任何非负自然数 N
,定义其后续者,Succ<N>
,一个正数。我们现在可以计数了!
因为我们想要所有的整数而不是仅仅是自然数,所以我们必须对这些定义稍加小心,这也是为什么上面指定的 N
不能是负数的原因。否则,当我们定义前驱时,我们可能会得到 Pred<Succ<Zero>>
,它应该代表数字 Zero
,但它是一个不同的类型,并且编译器不会将其视为此类。
我们现在可以定义负数:对于任何非正自然数 N
,定义其前驱,Pred<N>
,一个负数。
根据 Pred
和 Succ
的定义,我们禁止它们一起使用。
从概念上讲,我们现在可以访问所有整数。在实际情况中,除非我们使用 #![recursion_limit="N"]
lint 来增加允许的内嵌特质的数量,否则我们只能访问从 -63 到 63 的数字。
除了这里创建的特质外,特质 Add
、Sub
、Mul
、Div
和 Neg
都为 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。