Scala中的currying的好处

ini*_*max 5 scala

我想澄清有关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会有什么好处吗?

Omi*_*mid 0

来自 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)