定义:
柯里化是将方法或者函数中一个带有多个参数的列表拆分成多个小的参数列表(一个或者多个参数)的过程,并且将参数应用前面参数列表时返回新的函数(调用函数求值,求得的值是下一个函数的一个参数,将参数传递给下一个函数)
典型实例
//这是一个没有柯里化的方法
scala> def sum(x:Int, y:Int) = x+ y
sum: (x: Int, y: Int)Int
scala> sum(2,4)
res17: Int = 6
#将sum写成柯里化的sum,前面方法使用一个参数列表,“柯里化”把方法或者函数定义成多个参数列表(且第一个参数只有一个参数,剩余的参数可以放在一个参数列表中)
scala> def sum(x:Int)(y:Int) = x+y
sum: (x: Int)(y: Int)Int
scala> sum(2)(4)
res18: Int = 6
scala> def sum(x:Int)(y:Int)(z:Int) = x+y+z
sum: (x: Int)(y: Int)(z: Int)Int
scala> sum(2)(4)(5)
res19: Int = 11
scala> def sum(x:Int)(y:Int, z:Int) = x+y+z
sum: (x: Int)(y: Int, z: Int)Int
scala> sum(2)(3,4)
res20: Int = 9
//下面是调用的本质
#当你调用sum(2)(4)时, 实际上是依次调用了两个普通函数(非柯里化函数)
//第一次调用使用一个参数,x 返回一个函数值
//第二次使用参数y调用这个函数值,下面来用两个分开的定义来模拟sum柯里化函数的调用过程
scala> def first(x:Int) = (y:Int) => x+y
first: (x: Int)Int => Int //frist返回的是函数值,x既是方法参数,又是函数的闭包参数
#调用first方法会返回函数值,既产生第二个函数
scala> val second = first(1) //产生了第二个函数
second: Int => Int = <function1> //second是函数变量名,引用某个函数值
scala> second(2)
res21: Int = 3
#上面first,second的定义演示了柯里化函数的调用过程,他们本身和sum并没有任何关系,但是
scala> def sum(x:Int)(y:Int) = x+yf
sum: (x: Int)(y: Int)Int
scala> val second = sum(1) _ //sum(1)相当于第二方法的方法名
second: Int => Int = <function1>
scala> second(2)
res22: Int = 3