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”
}
另见: