scala学习手记25 - Curry化
curry翻译为中文就是咖喱。意为使用curry可以让代码更有味道。
scala里的curry化可以把函数从接收多个参数转换成接收多个参数列表。也就是说我们要编写的函数不是只有一个参数列表,这个参数列表中有多个参数以逗号分隔;而是一个函数中有多个参数列表,每个参数列表中只有一个参数(当然,也可以有多个参数)。也就是说我们写的函数不再只是这样子的:
def foo(a: Int, b: Int, c: Int) {}
而是这样子的:foo(1)(2)(3),或者这样的:foo(1){2}{3},甚至是这样子的:foo{1}{2}{3}。
来看一下定义成多个参数列表的方法到底是什么样的。这次使用scala交互式shell会话:
按照上面所说我们定义了一个函数foo()。然后,调用foo_创建了一个偏应用函数,也就是说,这个函数有一个或多个参数未绑定。关于偏应用函数稍后会详细说,这次主要关注交互式shell提供的消息:先是三个一连串的转换,链中的每个函数都接收一个Int,返回一个偏应用函数。不过,最后一个的结果是Unit。
现在可以使用curry化的形式重写一下inject方法:
def inject(arr: Array[Int], initial: Int)(operation: (Int, Int) => Int): Int = { var carryOver = initial arr.foreach(element => carryOver = operation(carryOver, element)) carryOver }
这样一来,我们就不必在一个参数列表里用逗号分割的形式传递参数了。现在可以使用圆括号或花括号独立传递参数了:
val array = Array(2, 3, 5, 1, 6, 4) val sum = inject(array, array(0)){ (carryOver, elem) => Math.max(carryOver, elem) } println("Max of elements in array [" + array.mkString(",") + "] is " + sum)
是不是看起来更优雅了——虽然刚见到的时候理解有些困难,但是熟悉了这种语法后还是能体会到它的好处的。
########
仅是学习笔记,难免出错,望不吝指点