柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。
先看看实例:
首先定义一个函数:
def plus(x:Int,y:Int) = x + y //非柯里化函数
现在,把上面的函数变下形:
def plus(x:Int)(y:Int) = x + y //柯里化函数
//或者
def plus(x:Int) = (y:Int) => x + y //柯里化函数
//那么我们应用的时候,应该是这样用:plus(1)(2),最后结果都一样是3,这种方式(过程)就叫柯里化。
实现过程:
plus(1)(2)实际上是调用两个普通函数(非柯里化),第一次使用参数x,返回一个函数类型的值,第二次使用参数y调用这个函数类型的值。
本质上是先演变成这样一个方法:
def plus(x:Int)=(y:Int)=>x+y
//这个函数就是接收一个x为参数,返回一个匿名函数,
//该匿名函数的定义是:接收一个Int型参数y,函数体为x+y。现在我们来对这个方法进行调用。
val r1 = plus(1)
返回一个result,那result的值应该是一个匿名函数:(y:Int)=>1+y
所以为了得到结果,我们继续调用r1。
val sum = r(2)
最后打印出来的结果就是3。
下面看个完整的例子
val str1:String = "Hello, "
val str2:String = "Scala!"
println( "str1 + str2 = " + strcat(str1)(str2) )
def strcat(s1: String)(s2: String) = {
s1 + s2
}
//结果:str1 + str2 = Hello, Scala!
def mulCurry(x: Int) = (y: Int) => x * y
println(mulCurry(10)(9))
def mulCurry2(x: Int)(y:Int) = x * y
println(mulCurry2(10)(8))
柯里化的应用:
比较两个字符串在忽略大小写的情况下是否相等,注意,这里是两个任务:
1、全部转大写(或小写)
2、比较是否相等
val a = Array("Hello", "World")
val b = Array("hello", "world")
println(a.corresponds(b)(_.equalsIgnoreCase(_)))