@amoszhou
2014-04-29T07:53:14.000000Z
字数 731
阅读 2866
scala
柯里化
首先,我们还是来看个实例,看看什么叫Currying.
首先我们定义一个函数:
def add(x:Int,y:Int)=x+y
那么我们应用的时候,应该是这样用:add(1,2)
现在我们把这个函数变一下形:
def add(x:Int)(y:Int) = x + y
那么我们应用的时候,应该是这样用:add(1)(2)
,最后结果都一样是3.这种方式(过程)就叫柯里化。
柯里化实现起来很简单,简单的说就是将每一部分参数单独提出来。那么这个是怎么实现的列?让我们来试试看一下演变过程。
实质上最先演变成这样一个方法:
def add(x:Int)=(y:Int)=>x+y
那么这个函数是什么意思列? 接收一个x
为参数,返回一个匿名函数,该匿名函数的定义是:接收一个Int型参数y
,函数体为x+y
。现在我们来对这个方法进行调用。
val result = add(1)
返回一个result.那result的值应该是一个匿名函数:(y:Int)=>1+y
所以为了得到结果,我们继续调用result。
val sum = result(2)
最后打印出来的结果就是3。所以我们就看到最一开始的调用方式
add(1)(3)
实际上是连着调用了2个函数,是一种简化的写法。
柯里化有几分类似建造者模式(building)。建造者模式的实现代码类似如下:
Person.name("scala").age(25).address("xxx")
在思想上都是把一个大的东西的构造过程,切分成一个个小模块,逐步来构建。当然,我们举的那个柯化里的例子好像并不能很好体现柯里化的优势,试想想当你一个函数的参数比较多,而且每个参数都是匿名函数的时候,这种优势就会体现出来。