繁体   English   中英

是否有可能在Rust中编写Haskell的翻转函数?

[英]Is it possible to write Haskell's flip function in Rust?

Haskell的翻转函数定义如下:

flip :: (a -> b -> c) -> b -> a -> c
flip f x y =  f y x

它只需要一个函数并返回另一个有两个参数反转的函数。 如果你将函数f称为fabf(a, b)在类似Rust的语法中),你可以将flip f称为(flip f) ba

我在Rust写这个不成功的尝试:

fn flip<A, B, C, F: Fn(A, B) -> C>(f: F) -> impl Fn(B, A) -> C {
    |a, b| f(b, a)
}

是否可以在Rust中写这个?

我不确定你得到了什么错误,但我能够使用此代码正确实现它( 用于测试的游乐场链接 ):

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所有权。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM