你能创建一个函数,它接受另一个函数和一个参数,并返回一个嵌套函数调用的惰性流吗?

Pum*_*use 7 rust

在Clojure中,我使用了一个名为iterate:

返回x,(fx),(f(fx))等的延迟序列.f必须没有副作用

Rust中有类似的东西吗?

例如,我有这个函数,我想传递给一个带有数字的函数,然后迭代一个流/范围/向量,直到找到Some(1):

fn coltz(n: u64) -> Option<u64> {
    match n % 2 {
        0 => Some(n / 2), 
        _ => Some(3 * n + 1)
    }
}
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 7

您可以使用std::iter::repeat_with()以下命令重复调用闭包:

repeat_with(move || {
    let result = x;
    x = f(x);
    result
})
Run Code Online (Sandbox Code Playgroud)

返回值是闭包的连续返回值的迭代器.

我们使用move移入x闭包,作为迭代的当前状态.瓶盖内我们更新xf(x)和返回旧值(因此在第一次迭代我们回到原来的x).

这是一个完整的工作示例:

use std::iter::repeat_with;

fn collatz(n: u64) -> u64 {
    match n % 2 {
        0 => n / 2,
        _ => 3 * n + 1,
    }
}

fn iterate<F, X>(f: F, mut x: X) -> impl Iterator<Item = X>
where
    F: Fn(X) -> X,
    X: Copy,
{
    repeat_with(move || {
        let result = x;
        x = f(x);
        result
    })
}

fn main() {
    for i in iterate(collatz, 12).take_while(|&x| x != 1) {
        println!("{}", i);
    }
}
Run Code Online (Sandbox Code Playgroud)

操场