在Rust中有相当于Haskell的迭代吗?

时间:2019-02-21 15:39:26

标签: rust

Haskell的iterate函数反复将一个函数应用于一个值以生成一系列值。例如,将(^ 2)应用于2会生成2,2 ^ 2,2 ^ 2 ^ 2,2 ^ 2 ^ 2 ^ 2,...(2,4,16,16,256,...)

Rust是否有同等功能?

3 个答案:

答案 0 :(得分:5)

这在标准库中不存在,但是itertools板条箱有iterate

  

创建一个新的迭代器,该迭代器将函数无限地应用于值并产生结果。

use itertools::iterate;

itertools::assert_equal(iterate(1, |&i| i * 3).take(5), vec![1, 3, 9, 27, 81]);

答案 1 :(得分:0)

itertools::iterate似乎就是您想要的。

答案 2 :(得分:0)

Rust 1.34开始,您可以使用std::iter::successors

因此,对于此问题,您将执行以下操作:

playpen

use std::iter::successors;

fn main() {
    let v = successors(Some(2u8), |n| n.checked_mul(10)).collect::<Vec<_>>();
    assert_eq!(v, vec![2, 20, 200]);

    for i in successors(Some(2_u32), |n| n.checked_mul(10)) {
        println!("{}", i);
    }
}

还要看看std::iter::from_fn,它可能会更强大。