Scala编程(第4版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

9.3 柯里化

在第1章,我们说过Scala允许你创建新的控制抽象,“感觉就像是语言原生支持的那样”。尽管到目前为止你看到的例子的确都是控制抽象,应该不会有人会误以为它们是语言原生支持的。为了搞清楚如何做出那些用起来感觉更像是语言扩展的控制抽象,首先需要理解一个函数式编程技巧,那就是柯里化currying)。

一个经过柯里化的函数在应用时支持多个参数列表,而不是只有一个。示例9.2展示了一个常规的,没有经过柯里化的函数,对两个Int参数xy做加法。

示例9.2 定义并调用一个“普通”的函数

与此相反,示例9.3展示了一个相似功能的函数,不过这次是经过柯里化的。跟使用一个包含两个Int参数列表不同,应用这个函数到两个参数列表,每个列表包含一个Int参数。

示例9.3 定义并调用一个柯里化的函数

这里发生的事情是,当你调用curriedSum,实际上是连着做了两次传统的函数调用。第一次调用接收了一个名为xInt参数,返回一个用于第二次调用的函数值,这个函数接收一个Int参数y。参考下面这个名为first的函数,从原理上讲跟前面提到的curriedSum的第一次传统函数调用做了相同的事:

first函数应用到1(换句话说,调用第一个函数,传入1)将交出第二个函数:

应用第二个函数到2将交出下面的结果:

这里的firstsecond函数只是对柯里化过程的示意,它们跟curriedSum并不直接相关。尽管如此,我们还是有办法获取到指向curriedSum的“第二个”函数的引用。这个办法就是通过占位符表示法,在一个部分应用函数表达式中使用curriedSum,就像这样:

代码curriedSum(1)_中的下画线是第二个参数列表的占位符。[2]其结果是一个指向函数的引用,这个函数在被调用时,将对它唯一的Int入参加1后,返回结果:

如果想得到一个对它唯一的Int入参加2的函数,可以这样做: