1个不稳定版本
0.1.0 | 2020年8月22日 |
---|
#8 in #hkt
18KB
358 行
标准泛型特性。
为什么
你有没有需要过泛型的 Sequence
特性?有没有想过一个既可以用 Rc
又可以用 Arc
的数据结构?一个返回借用数据的迭代器?
这些在稳定的Rust中通常被认为是不可能的,因为缺乏对高阶类型(HKTs)的原生支持。HKTs是一种特性,它允许我们推理,例如,Vec
而不需要用类型参数完全定义它(Vec<T>
)。通常认为不可能的经典例子是流式(或借用)迭代器,其中 next()
返回一个由迭代器本身约束生命周期的项目。
trait StreamingIterator {
type Item = &str;
fn next<'a>(&'a mut self) -> Option<&'a str> {
unimplemented!()
}
}
这不能编译,因为引用 &str
必须声明一个生命周期,但我们只有 self
在 next()
本身中的生命周期,而不是在关联类型声明中。与类型别名不同,关联类型(特性中的类型)不能有类型参数。也就是说,以下是不合法的
trait StreamingIterator {
type Item<'a> = &'a str;
fn next<'a>(&'a mut self) -> Option<&'a str> {
unimplemented!()
}
}
这被称为关联类型构造器。有关更多信息,请参阅RFC和Nicholas的ATC帖子系列。
然而,在稳定的Rust中,可以通过更多的样板代码来模拟这种行为。请参阅StreamingIterator
特性。
如何
这个库通过使用Edmund Smith的方法模拟高阶类型的一个变体,为std
类型实现多个泛型特性。请参阅plug模块以获取详细信息。
限制
HKT类型的实现似乎已经通过插件方法完成。也就是说,你可以通过这种方法获得与原生HKT类型支持相同的功能。不过,尽管它可行,用户体验并不理想。
由于无法对HRTB生命周期设置界限,因此在HKT生命周期方面存在一些限制。例如,像for<'a: 'b>
这样的代码是无法表达的。因此,某些特性和实现可能具有比必需的更严格的生存期限制。
当前状态
这个crate非常实验性,许多特性功能有限。