Haskell的flip函数定义如下:
flip :: (a -> b -> c) -> b -> a -> c
flip f x y = f y x
它所做的只是获取一个函数并返回另一个具有两个参数相反的函数。如果您以f
的形式调用函数f a b
(类似Rust语法的f(a, b)
),则以flip f
的形式调用(flip f) b a
。
我在Rust中编写此文件的尝试失败:
fn flip<A, B, C, F: Fn(A, B) -> C>(f: F) -> impl Fn(B, A) -> C {
|a, b| f(b, a)
}
有可能用Rust写这个吗?
答案 0 :(得分:9)
我不确定您遇到什么错误,但是我可以使用以下代码(playground link for testing)正确实现它:
fn flip<A, B, C, F>(f: F) -> impl Fn(B, A) -> C where F: Fn(A, B) ->C {
move |a,b| f(b, a)
}
fn main() {
let sub = |a, b| a - b;
let flipped = flip(sub);
println!("Result: {}", flipped(5, 10));
}
请注意此处的move
关键字,这是强制flip
返回的闭包获得f
所有权的必要条件。