我想澄清有关scala currying的好处.根据"Scala第二版编程" - "currying一种用多个参数列表编写函数的方法.例如,
def f(x: Int)(y: Int)带有两个参数列表的curried函数.通过传递多个参数列表来应用curried函数,如:f(3)(4).但是,也可以编写curried函数的部分应用,例如f(3)." "c"
与创建相关的一个好处是部分应用了这样的功能
def multiplyCurried(x: Int)(y: Int) = x * y
def multiply2 = multiplyCurried(2) _
Run Code Online (Sandbox Code Playgroud)
但是我们也可以使用部分应用的函数而不用currying
def multiplyCurried(x: Int,y: Int)
def multiply2 = multiplyCurried(2, _)
Run Code Online (Sandbox Code Playgroud)
你能举几个例子,currying会有什么好处吗?
来自 Coursera 课程:
假设您有以下功能:
def sum(f:Int=>Int, a:Int, b:Int) = f(a) + f(b)
def sumInts(a:Int,b:Int)=sum(x=>x,a,b)
def sumCubes(a:Int,b:Int)=sum(x=>x*x*x,a,b)
Run Code Online (Sandbox Code Playgroud)
将 sum 更改为返回另一个函数的函数:
def sum(f:Int=>Int):(Int,Int)=>Int={
def sumF(a:Int,b:Int):Int=
if(a>b) 0 else f(a)+ sumF(a+1,b)
sumF
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以通过以下方式定义我们拥有的功能:
def sumInts=sum(x=>x)
def sumCubes=sum(x=>x*x*x)
Run Code Online (Sandbox Code Playgroud)
现在我们可以通过简单的方式使用它:
sumInt(10,11) + sumCubes(3,4)
Run Code Online (Sandbox Code Playgroud)
现在我们有了我们想要避免的 sumInt 和 sumCube:
sum(cube)(3,4)
Run Code Online (Sandbox Code Playgroud)
因此,柯里化有助于在函数式编程中不要编写嵌套函数,让我们重新定义 sum:
def sum(f:Int=>Int)(a:Int,b:Int):Int=
if(a>b) 0 else f(a)+sum(f)(a+1,b)
Run Code Online (Sandbox Code Playgroud)