#hlist #heterogeneous #safe

无std hlist2

编译时异构列表实现

12个版本

0.0.14 2023年9月8日
0.0.13 2023年6月24日
0.0.8 2023年5月3日
0.0.6 2023年4月30日
0.0.2 2023年1月17日

#745 in Rust模式

Download history 50/week @ 2024-07-02 78/week @ 2024-07-30

每月下载量78

MIT/Apache

73KB
1.5K SLoC

hlist2

Crate Docs License

此crate定义了一种创建编译时异构列表的方法,或由多个类型组成的列表。

异构列表

此crate定义了空列表类型Nil和列表头及其剩余部分的对类型Cons。异构列表由许多相互递归包含的cons组成,最后一个cons包含最后一个元素并具有nil作为剩余部分。例如,整数、双精度和布尔值的异构列表可以表示为Cons(1, Cons(2.0, Cons(true, Nil))),其类型为Cons<i32, Cons<f64, Cons<bool, Nil>>>

递归性质和行为

异构列表的这种递归性质使我们能够递归地实现各种特性,而没有任何关于此类列表大小或其中包含的类型的大小限制。与元组不同,可以为所有异构列表实现特性,甚至为那些元素数量超过12个的列表实现特性,这是元组有时存在的问题。

所有异构列表都实现了HList特性,因此它可以在泛型中使用。例如,这可能有助于将泛型类型限制为异构列表。要为所有任何大小的异构列表实现您的特性,首先在Nil类型上实现它,该类型也是HList。然后,在具有头和尾泛型类型的Cons结构上实现您的特性,其中尾类型也是异构列表(或实现了HList特性的类型)。

这些技术的一些示例可以在ops模块中查看,其中实现了所有异构列表类型的特定操作。例如,要将任何值追加到列表末尾,使用Append特性;要将任何值 prepending 到列表开头,使用Prepend特性,依此类推。

构建和破坏异构列表

但是,当尝试给异构列表命名类型或使用异构列表值进行模式匹配时,这种递归性质可能会成为一个问题。为了简化列表的创建和列表类型的命名,该库定义了两个宏,hlist!HList!。第一个宏应该用于创建异构列表或进行模式匹配,而第二个宏应该用于为异构列表类型命名。

因此,我们不需要像这样编写 Cons(1, Cons(2.0, Cons(true, Nil))),而可以编写更易读的表达式,如 hlist![1, 2.0, true]

要命名此类列表的类型,我们可以写 HList![i32, f64, bool],而不是 Cons<i32, Cons<f64, Cons<bool, Nil>>>

元组兼容性

此外,此库还与元组类型具有兼容性。当元组长度为12或更少时,它实现了异构列表与其元组形式的转换,反之亦然。

特性

此库不使用任何不安全代码,以提供与Rust编程语言提供的相同的安全保证。

此库是 no_std,因此可以在嵌入式环境中自由使用且无需担忧。

灵感

此库旨在成为未维护的 hlist 库的替代品。这也受到了另一个开源库 frunk 的启发。

许可

许可协议为以下之一:

任选其一。

无运行时依赖