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)
}))