如何实现 `apply_n_times` 函数?
How do I implement an `apply_n_times` function?
如何实现一个 apply_n_times
函数,该函数获取一个函数 f: T -> T
和一个数字 n
,结果将是一个应用 f
[=15] 的函数=]次?
例如apply_n_times(f, 0)
等于 |x| x
,apply_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 章,但我向前搜索了一下。我可能必须 return 一个 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
,因为它对函数的用户更灵活。
另请参阅:
- How to use the Fn traits (closures) in Rust function signatures?
- Returning a closure from a function
如何实现一个 apply_n_times
函数,该函数获取一个函数 f: T -> T
和一个数字 n
,结果将是一个应用 f
[=15] 的函数=]次?
例如apply_n_times(f, 0)
等于 |x| x
,apply_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 章,但我向前搜索了一下。我可能必须 return 一个 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
,因为它对函数的用户更灵活。
另请参阅:
- How to use the Fn traits (closures) in Rust function signatures?
- Returning a closure from a function