Rust 类型级别的斐波那契序列结果为;“评估需求的溢出”;

Rust 类型级别的斐波那契序列结果为;“评估需求的溢出”;,rust,type-level-computation,Rust,Type Level Computation,我在写一个类型级别的斐波那契序列。我已经写了一个类型级别的加法,效果很好。每个数字都表示为Inc。有一个traitAdd,然后结构Bop(二进制操作)实现了Addtrait。用法是:Get将是Inc,即3+2=5 然后我根据加法写出一个斐波那契序列: use std::marker::PhantomData; struct Zero {} struct Inc<T> { _phantom: PhantomData<T>, } struct Bop<Left

我在写一个类型级别的斐波那契序列。我已经写了一个类型级别的加法,效果很好。每个数字都表示为
Inc
。有一个trait
Add
,然后结构
Bop
(二进制操作)实现了
Add
trait。用法是:Get将是
Inc
,即3+2=5

然后我根据加法写出一个斐波那契序列:

use std::marker::PhantomData;
struct Zero {}
struct Inc<T> {
    _phantom: PhantomData<T>,
}

struct Bop<Left, Right> {
    _phantom_l: PhantomData<Left>,
    _phantom_r: PhantomData<Right>,
}

trait Add {
    type Get;
}

impl<Left> Add for Bop<Left, Zero> {
    type Get = Left;
}

impl<Left, RightInner> Add for Bop<Left, Inc<RightInner>>
where
    Bop<Left, RightInner>: Add,
{
    type Get = Inc<<Bop<Left, RightInner> as Add>::Get>;
}

type One = Inc<Zero>;
type Two = Inc<One>;
type Three = Inc<Two>;
type Four = Inc<Three>;
type Five = Inc<Four>;
// then <Bop<Three, Two> as Add>::Get will be type Five

// 0 1 2 3 4 5 6 7
// 0 1 1 2 3 5 8 13
// usage: <Inc<Inc<Inc<Zero>>> as Fib>::Get should be the third fib number,
// i.e. 2, or Inc<Inc<Zero>>
trait Fib {
    type Get;
}
impl Fib for Zero {
    type Get = Zero;
}
impl Fib for One {
    type Get = One;
}

impl<T> Fib for Inc<Inc<T>>
where
    T: Fib,
    Inc<T>: Fib,
    Bop<<T as Fib>::Get, <Inc<T> as Fib>::Get>: Add,
{
    type Get = <Bop<<T as Fib>::Get, <Inc<T> as Fib>::Get> as Add>::Get;
}

fn main() {}
使用std::marker::PhantomData;
结构零{}
结构公司{
_幻影:幻影数据,
}
结构防喷器{
_幻影:幻影数据,
_幻影:幻影数据,
}
性状加{
类型Get;
}
国际收支平衡表{
类型Get=Left;
}
国际收支平衡表
哪里
国际收支平衡表:,
{
类型Get=Inc;
}
第一类=公司;
第二类=公司;
第三类=公司;
第四类=公司;
第五类=公司;
//那么::Get将是第五种类型
// 0 1 2 3 4 5 6 7
// 0 1 1 2 3 5 8 13
//用法:::Get应该是第三个fib编号,
//即2,或包括
特征纤维{
类型Get;
}
零的简单Fib{
Get类型=零;
}
一个简单的谎言{
类型Get=1;
}
impl Fib公司
哪里
T:小谎,
公司名称:Fib,
国际收支平衡表:,
{
键入Get=::Get;
}
fn main(){}

编译器无法计算Uop的
impl Fib
部分,它抱怨:

错误[E0275]:评估需求溢出'Inc:Fib`
|
=帮助:考虑添加一个“γ”![recursion_limit=“128”]`属性到您的板条箱
=注:由于'Inc'的'Fib'impl上的要求,需要`
=注:由于'Inc'的'Fib'impl上的要求,需要`
=注:由于'Inc'的'Fib'impl上的要求,需要`
=注:由于'Inc'的'Fib'impl上的要求,需要`
=注:由于'Inc'的'Fib'impl上的要求,需要`
=注:由于'Inc'的'Fib'impl上的要求,需要`
=注:由于'Inc'的'Fib'impl上的要求,需要`
=注:由于'Inc'的'Fib'impl上的要求,需要`
=注:由于'Inc'的'Fib'impl上的要求,需要`
=注:由于'Inc'的'Fib'impl上的要求,需要`
=注:由于'Inc'的'Fib'impl上的要求,需要`
=注:由于'Inc'的'Fib'impl上的要求,需要`
=注:由于'Inc'的'Fib'impl上的要求,需要`
//切断更多

错误的原因是什么?如何解决它?

对我来说,这看起来像是类型检查器不知何故进入了一个无限循环。也许您可以通过(暂时)消除
Uop
,设置所有
类型Get=0
,并有选择地取消注释类型要求来缩小问题的范围。您的代码看起来是正确的。我不希望它溢出。@phimuemue我认为这是一个编译器错误。每个类型只依赖于一个更简单的类型,因此没有理由将其分解。@PeterHall导致溢出的代码位于
Bop:Add,
constraint。IDK为什么编译器会转到相反的位置来评估一个更嵌套的类型。