Functional programming 迭代连续折叠结果的惯用和实用方法是什么?

Functional programming 迭代连续折叠结果的惯用和实用方法是什么?,functional-programming,rust,fold,Functional Programming,Rust,Fold,我有一个序列(列表,迭代器)a0,a1,a2,,我使用函数f折叠。我想要一台发电机,它能给我 a0, f(a0, a1), f(f(a0, a1), a2), ... 这类似于Mathematica中的FoldList。是否有可用的折叠列表功能?我找不到任何东西。我认为最接近的抽象是。它更强大一点,因为它有一个内部可变状态(即,可以为生成的迭代器生成不同的值),并且可以提前中止 您可以这样使用它来构建迭代器扩展特性: 我认为最接近的抽象是。它更强大一点,因为它有一个内部可变状态(即,可以为生

我有一个序列(列表,迭代器)
a0,a1,a2,
,我使用函数
f
折叠。我想要一台发电机,它能给我

a0, f(a0, a1), f(f(a0, a1), a2), ...

这类似于Mathematica中的
FoldList
。是否有可用的
折叠列表
功能?我找不到任何东西。

我认为最接近的抽象是。它更强大一点,因为它有一个内部可变状态(即,可以为生成的迭代器生成不同的值),并且可以提前中止

您可以这样使用它来构建迭代器扩展特性:


我认为最接近的抽象是。它更强大一点,因为它有一个内部可变状态(即,可以为生成的迭代器生成不同的值),并且可以提前中止

您可以这样使用它来构建迭代器扩展特性:

pub trait FoldListExt: Iterator {
    fn fold_list<'a, St: 'a, F: 'a>(self, initial_state: St, f: F) -> Box<Iterator<Item = St> + 'a>
    where
        St: Clone,
        F: FnMut(St, Self::Item) -> St,
        Self: 'a;
}

impl<I: Iterator> FoldListExt for I {
    fn fold_list<'a, St: 'a, F: 'a>(
        self,
        initial_state: St,
        mut f: F,
    ) -> Box<Iterator<Item = St> + 'a>
    where
        St: Clone,
        F: FnMut(St, Self::Item) -> St,
        Self: 'a,
    {
        Box::new(self.scan(Some(initial_state), move |state, item| {
            let old_state = state.take().unwrap();
            *state = Some(f(old_state.clone(), item));
            Some(old_state)
        }))
    }
}

pub fn main() {
    println!(
        "{:?}",
        (0..16)
            .into_iter()
            .fold_list(0, |a, b| a + b)
            .collect::<Vec<_>>()
    );
}
Box::new(self.scan(initial_state, move |state, item| {
    let old_state = state.clone();
    *state = f(old_state.clone(), item);
    Some(old_state)
}))