Function 如何在Rust中实现多级Curry功能?

Function 如何在Rust中实现多级Curry功能?,function,rust,functional-programming,closures,currying,Function,Rust,Functional Programming,Closures,Currying,我尝试实现一个类似于以下内容的货币兑换功能: fn添加原点(x:i32)->impl fn(i32)->i32{ 回击动作| y |{ x+y }; } fn main(){ 设add5=add_原点(5); println!(“调用闭包:{}”,add5(6)); } 这是可行的,但如果我再添加一个级别: fn-add(x:i32)->impl-fn(i32)->impl-fn(i32)->i32{ 回击动作| y:i32 |{ 回击动作| z:i32 |{ x+y+z } }; } fn

我尝试实现一个类似于以下内容的货币兑换功能:

fn添加原点(x:i32)->impl fn(i32)->i32{
回击动作| y |{
x+y
};
}
fn main(){
设add5=add_原点(5);
println!(“调用闭包:{}”,add5(6));
}
这是可行的,但如果我再添加一个级别:

fn-add(x:i32)->impl-fn(i32)->impl-fn(i32)->i32{
回击动作| y:i32 |{
回击动作| z:i32 |{
x+y+z
}
};
}
fn main(){
设add5=add(5);
设add5_10=add5(10);
println!(“调用闭包:{}”,add5_10(6));
}
编译器不接受并告诉我:

error[E0562]: `impl Trait` not allowed outside of function and inherent method return types
 --> src/main.rs:7:35
  |
7 | fn add(x: i32) -> impl Fn(i32) -> impl Fn(i32) -> i32 {
  |                                   ^^^^^^^^^^^^^^^^^^^

error: aborting due to previous error

为什么这是不允许的?有没有更好的方法来实现Rust中的currying?

impl Trait语法只能用于函数签名的参数位置或返回位置。这两个都很好:

fn取fn(fn_arg:impl-fn(i32)->i32){
fn返回_fn()->impl fn(i32)->i32{
|x | x
}
但是,这两项工作都不起作用:

fn取fn(fn_arg:impl-fn(i32)->impl-fn(i32)->i32){
fn返回\u fn()->impl fn(i32)->impl fn(i32)->i32{
|x | x
}
因为第二个嵌套的
impl Trait
不再位于参数或返回位置,而是参数或返回类型签名的一部分,这是不允许的。基本上,多个嵌套的
impl Trait
s将永远不会工作,无论您将它们放置在何处,您将始终得到相同的编译错误

好消息是,这不会阻止您完成您想要完成的任务,因为
impl Trait
只是语法糖,它的使用是可选的。在您的特定示例中,我们可以使用装箱的trait对象返回您的curried函数

fn添加(x:i32)->impl-fn(i32)->Box i32>{
移动| y:i32 |{
框::新(移动| z:i32 |{
x+y+z
})
}
}
fn main(){
设add5=add(5);
设add5_10=add5(10);
println!(“调用闭包:{}”,add5_10(6));//打印“调用闭包:21”
}

另见:

我找到了一个解决方案: