#numbers #order #typenum #fun #clone #negative #positive

number-types

一个为了娱乐而制作的 typenum 克隆,进行了一些改进,但功能较少

1 个不稳定版本

0.1.0 2023 年 11 月 14 日

#2299Rust 模式

MIT 许可证

12KB
274

number-types

一个原始类型,尽管略有改进,是为了更熟悉类型系统而制作的 typenum 包的重新创建。

相对于 typenum 的改进

它使用自己的特性和类型,而不是实例。永远不会创建任何实例。

基本上就是这些,其他的东西可能更差。这只是为了娱乐。

如何使用它

有几个宏,用于更轻松地构建表达式。它们始终以相同的顺序执行操作:type_expr!(<a> * <b> + <c> - <d>) 将执行 (a * (b + (c - d)))。很奇怪,但这不是我的选择。我只是不想花那么长时间在宏上。

有 Z0..Z10 和 Z100 这样的类型,以及每个类型的负数对应项 (ZN...)。要自己构建操作,请使用 <Op<Lhs, Rhs> as OpKindOp>::Output (OpKind 应为 Add、Mul 或 Sub)。要取一个数的相反数,请使用 <N as Neg>::Output

您可以使用 assert_type_eq!(a, b) 来断言类型相等。

它如何工作

所有数字都是围绕 Zero 的 N 层 Successor 包装。负数也在最顶层获得一个 Negative 包装。

加法基本上是这样做的

  • 如果 Lhs 是 Zero,则 Output = Rhs 并返回。
  • 否则,展开一层,重复第一步,将结果包裹在一层中,然后返回它。

减法是这样做的

  • 如果 Rhs 是 Zero,则 Output = Lhs。
  • 如果 Lhs 是 Zero,则 Output = Negative
  • 否则,在两侧展开一层,然后再次尝试。

这包括了一些处理负数的案例(因为它们可能会将减法变成本质上相当于加法),但这里不会对这些案例进行解释。

乘法是重复加法。


你知道你可以进行类型匹配吗?

impl<A: Constr, B: Constr, O> TraitA<B> for SomeWrapper(A)
where
  SomeOtherOrSameWrapper(A): TraitB<B, Output = O>
{
  type Output = O;
}

:3

没有运行时依赖。