gpt4 book ai didi

rust - 如何实现 `apply_n_times` 函数?

转载 作者:行者123 更新时间:2023-12-03 11:27:15 24 4
gpt4 key购买 nike

我如何实现一个 apply_n_times 函数,该函数获取一个函数 f: T -> T 和一个数字 n,结果将是应用 f n 次的函数?

例如apply_n_times(f, 0) 等于 |x| xapply_n_times(f, 3) 等于 |x| f(f(f(x))).

这个功能没有更深层次的意义,只是想实现一下,学习一下。

我当前的代码:

fn apply_n_times<T>(f: Fn(T) -> T, n: i32) -> dyn Fn(T) -> T {
if n < 0 {
panic!("Cannot apply less than 0 times!");
}

if n == 1 {
|x: T| x
} else {
|x| f(apply_n_times(f, n - 1)(x))
}
}

fn times_two(n: i32) -> i32 {
return n * 2;
}

fn main() {
println!("{}", apply_n_times(times_two, 0)(3));
println!("{}", apply_n_times(times_two, 1)(3));
println!("{}", apply_n_times(times_two, 3)(3));
}

我在 Rust 书的第 13 章,但我向前搜索了一下。我可能必须返回一个 Box,但我不太确定。我试过了,但失败了。

我也想把签名改成这个,但这只会导致问题:

fn apply_n_times<F, T>(f: F, n: i32) -> F
where
F: Fn(T) -> T,

不幸的是,编译器错误对我没有帮助;他们说底层有什么问题,我却在兜圈子。

最佳答案

fn apply_n_times<T>(f: impl Fn(T) -> T, n: usize) -> impl Fn(T) -> T {
move |arg| (0..n).fold(arg, |a, _| f(a))
}

使用 usize 避免了否定检查的需要。考虑使用 FnMut 而不是 Fn,因为它对于函数的用户来说更灵活。

另见:

关于rust - 如何实现 `apply_n_times` 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63267439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com