是否可以在Rust中编写Haskell的翻页功能?

Lis*_*one 5 haskell rust

Haskell的翻页功能定义如下:

flip :: (a -> b -> c) -> b -> a -> c
flip f x y =  f y x
Run Code Online (Sandbox Code Playgroud)

它所做的只是获取一个函数并返回另一个具有两个相反参数的函数。如果你调用的函数ff a bf(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)
}
Run Code Online (Sandbox Code Playgroud)

可以用Rust写这个吗?

ape*_*lla 10

我不确定您遇到什么错误,但是我可以使用以下代码(用于测试的操场链接)正确实现它:

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));
}
Run Code Online (Sandbox Code Playgroud)

请注意move此处的关键字,该关键字是强制由返回的闭包flip获得的所有权的关键字f