实现fingertree时“在添加drop-check规则时溢出”

问题描述 投票:4回答:1

我正在尝试定义一个手指树结构,并将其基本操作实现为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;
   |                                      ^^^^^

为什么这不起作用?我如何使其工作?

data-structures rust recursive-type
1个回答
2
投票

您创建了一个无限类型。

实例化FingerTree<V, A>实例化FingerTree<V, Node<V, A>>实例化实例化的FingerTree<V, Node<V, Node<V, A>>>,......并且看不到尽头。

编译器无法确定在运行时实际不会使用该类型,因此应为最坏的情况做好准备。而最坏的是无限的。

简单地用tree替换Box<FingerTree<V, A>>的类型解决了这个问题,尽管对于手头的情况可能不正确。

© www.soinside.com 2019 - 2024. All rights reserved.