2个版本
0.1.1 | 2020年9月24日 |
---|---|
0.1.0 | 2020年9月24日 |
#6 in #translates
在 type-vec 中使用
135KB
3.5K SLoC
TYP:Rust中的类型级编程
TYP使您能够使用Rust语法编写类型运算符,即转换类型的函数。
它是willcrichton/Tyrade的重构,并受到jerry73204/type-freak的启发。
特性
Rust语法
TYP采用类似于Rust的语法,其中值成为类型,而类型成为特质的边界。其核心概念是类型运算符,它是一个接受类型参数并产生类型的函数。输入和输出类型可以可选地添加特质边界。
fn TypeOperatorName<generic1, generic2>(type1: _, type2: Trait1 + Trait2) -> TraitBound { ... }
<generic1, generic2>
列出了帮助区分公共类型的泛型标识符。type1
和type2
是由泛型和公共类型组成的输入类型。type1: _
表示该类型没有特质边界。- 输出特质边界
fn() -> TraitBound
是可选的。
以下代码片段演示了一个简单的类型运算符。
typ! {
use typenum::Unsigned;
fn Add<lhs, rhs>(lhs: Unsigned, rhs: Unsigned) -> Unsigned {
lhs + rhs
}
}
内置的typenum支持
TYP为typenum提供了一等支持。整数字面量被转换为typenum类型。以下字面量被TYP所理解。
- 有符号整数:
7
或7i
- 无符号整数:
7u
- 位:
true
和false
常见的二进制和一元运算符适用于具有适当特质的类型。例如,A + B
扩展为 <A as Add<B>>::Output
。
typ! {
use typenum::{Integer, Bit};
fn IsOdd<value>(value: Integer) -> Bit {
if value % 2 == 1 {
true
} else {
false
}
}
}
类型匹配
与普通的 Rust 一样,match
语法允许您匹配和展开类型。您可以使用 #[generics(...)]
属性在模式上绑定新的泛型。
示例演示了一个类型运算符,该运算符在类型级别列表的末尾追加一个类型。这是通过递归地将列表展开到 Cons
节点和 Nil
列表末尾标记来完成的。
pub trait List {}
pub struct Cons<Head, Tail: List> { /* omit */ }
impl<Head, Tail: List> List for Cons<Head, Tail> {}
pub struct Nil;
impl List for Nil {}
typ! {
fn Append<input, value>(input: List, value: _) -> List {
match input {
#[generics(head, tail: List)]
Cons::<head, tail> => {
let new_tail = Append(tail, value);
Cons::<head, new_tail>
}
Nil => {
Cons::<value, Nil>
}
}
}
}
示例
更高级的示例可以在 tests/ 目录中找到。
许可证
MIT 许可证。请参阅 LICENSE.txt。
依赖项
~3MB
~62K SLoC