[关闭]
@amoszhou 2014-04-29T07:53:14.000000Z 字数 731 阅读 2866

柯里化(Currying)

scala 柯里化


1.实例

首先,我们还是来看个实例,看看什么叫Currying.
首先我们定义一个函数:

  1. def add(x:Int,y:Int)=x+y

那么我们应用的时候,应该是这样用:add(1,2)
现在我们把这个函数变一下形:

  1. def add(x:Int)(y:Int) = x + y

那么我们应用的时候,应该是这样用:add(1)(2),最后结果都一样是3.这种方式(过程)就叫柯里化。

2.实现过程

柯里化实现起来很简单,简单的说就是将每一部分参数单独提出来。那么这个是怎么实现的列?让我们来试试看一下演变过程。
实质上最先演变成这样一个方法:

  1. def add(x:Int)=(y:Int)=>x+y

那么这个函数是什么意思列? 接收一个x为参数,返回一个匿名函数,该匿名函数的定义是:接收一个Int型参数y,函数体为x+y。现在我们来对这个方法进行调用。

  1. val result = add(1)

返回一个result.那result的值应该是一个匿名函数:(y:Int)=>1+y
所以为了得到结果,我们继续调用result。

  1. val sum = result(2)

最后打印出来的结果就是3。所以我们就看到最一开始的调用方式

  1. add(1)(3)

实际上是连着调用了2个函数,是一种简化的写法。

3.思考

柯里化有几分类似建造者模式(building)。建造者模式的实现代码类似如下:

  1. Person.name("scala").age(25).address("xxx")

在思想上都是把一个大的东西的构造过程,切分成一个个小模块,逐步来构建。当然,我们举的那个柯化里的例子好像并不能很好体现柯里化的优势,试想想当你一个函数的参数比较多,而且每个参数都是匿名函数的时候,这种优势就会体现出来。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注