我正在尝试定义一个手指树结构,并将其基本操作实现为Rust中的练习。我已经提出了以下内容,基本上就是paper中描述的内容。
use self::FingerTree::{Empty, Single, Deep};
use self::Digit::{One, Two, Three, Four};
enum Digit<A> {
One(A),
Two(A, A),
Three(A, A, A),
Four(A, A, A, A),
}
enum Node<V, A> {
Node2(V, A, A),
Node3(V, A, A, A),
}
enum FingerTree<V, A> {
Empty,
Single(A),
Deep {
size: V,
prefix: Digit<A>,
tree: Box<FingerTree<V, Node<V, A>>>,
suffix: Digit<A>,
},
}
fn main() {
let e: FingerTree<i32, String> = Empty;
}
编译给我一个我不明白的错误:
error[E0320]: overflow while adding drop-check rules for FingerTree<i32, std::string::String>
--> fingertree.rs:28:9
|
28 | let e: FingerTree<i32, String> = Empty;
| ^
|
note: overflowed on enum Node variant Node2 field 0 type: i32
--> fingertree.rs:28:9
|
28 | let e: FingerTree<i32, String> = Empty;
| ^
error[E0320]: overflow while adding drop-check rules for FingerTree<i32, std::string::String>
--> fingertree.rs:28:38
|
28 | let e: FingerTree<i32, String> = Empty;
| ^^^^^
|
note: overflowed on enum Node variant Node2 field 0 type: i32
--> fingertree.rs:28:38
|
28 | let e: FingerTree<i32, String> = Empty;
| ^^^^^
为什么这不起作用?我如何使它工作?
答案 0 :(得分:2)
您创建了一个无限类型。
实例化FingerTree<V, A>
实例化FingerTree<V, Node<V, A>>
实例化实例化的FingerTree<V, Node<V, Node<V, A>>>
,......并且看不到尽头。
编译器无法确定在运行时实际不会使用该类型,因此应为最坏的情况做好准备。而最坏的情况是无限的。
只需将tree
的类型替换为Box<FingerTree<V, A>>
即可解决问题,但对于当前的情况可能不正确。