scala之评估柯里化(Currying)函数

soundcode 阅读:15 2024-10-01 17:34:08 评论:0

这个柯里化(Currying)函数接受一个有两个参数的函数并将其转换为一个有 1 个参数的函数:

def hotcurry[A, B, C](f: (A, B) => C): A => (B => C) = 
  a => b => f(a, b)                             //> hotcurry: [A, B, C](f: (A, B) => C)A => (B => C) 
 
def f(a : Int , b : Int) = a + b          //> f: (a: Int, b: Int)Int 
 
hotcurry(f)                               //> res0: Int => (Int => Int) = <function1> 

如何返回函数res0: Int => (Int => Int) = <function1>被评估?

我试过了 fu(2) //> res0: Int => Int = <function1>

此功能的良好用例是什么?

请您参考如下方法:

只需一次传递一个参数:

val g: Int => (Int => Int) = (a: Int) => (b: Int) => a + b 
g(3)(4) 
// res4: Int = 7 

g 接受一个 Int,并返回一个函数 Int => Int。然后该函数接受一个 Int 并返回一个 Int。因此,您将一个参数传递给第一个函数,然后将一个参数传递给返回的函数。

在您的情况下,只需执行以下操作:

val g = hotcurry(f) 
g(3)(4) 

如果你有一个双参数函数,你想稍后使用它作为一个参数函数,你可以使用它,提前打包一个参数。例如,map 有一个参数 Int => Int,所以你可以这样做:

val add = hotcurry(f) 
val add3 = add(3) 
Vector(1, 2, 3).map(add3) 
// Vector(4, 5, 6) 


标签:Scala
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号