#泛型 #特性 #标准 #hkt #实验性 #框架 #迭代器

generic-std

实验性HKT框架和标准库的泛型特性

1个不稳定版本

0.1.0 2020年8月22日

#8 in #hkt

MIT 许可证

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 必须声明一个生命周期,但我们只有 selfnext() 本身中的生命周期,而不是在关联类型声明中。与类型别名不同,关联类型(特性中的类型)不能有类型参数。也就是说,以下是不合法的

trait StreamingIterator {
  type Item<'a> = &'a str;
  fn next<'a>(&'a mut self) -> Option<&'a str> {
    unimplemented!()
  }
}

这被称为关联类型构造器。有关更多信息,请参阅RFCNicholas的ATC帖子系列

然而,在稳定的Rust中,可以通过更多的样板代码来模拟这种行为。请参阅StreamingIterator特性。

如何

这个库通过使用Edmund Smith的方法模拟高阶类型的一个变体,为std类型实现多个泛型特性。请参阅plug模块以获取详细信息。

限制

HKT类型的实现似乎已经通过插件方法完成。也就是说,你可以通过这种方法获得与原生HKT类型支持相同的功能。不过,尽管它可行,用户体验并不理想。

由于无法对HRTB生命周期设置界限,因此在HKT生命周期方面存在一些限制。例如,像for<'a: 'b>这样的代码是无法表达的。因此,某些特性和实现可能具有比必需的更严格的生存期限制。

当前状态

这个crate非常实验性,许多特性功能有限。

无运行时依赖