如上样例,方法中可以指定任意多个参数列表,而每个参数列表中也可以包含多个参数。但通常很少有人使用两个以上的参数列表。
多参列表的优点: 1. 由于Scala允许把只有一个参数的参数列表两边的圆括号替换为花括号,故当多参列表的最后一个参数列表只包含一个表示函数的参数且此函数字面量很长时,则多参数列表的形式将拥有更整齐的结构语法(也即更加美观)。 2. 由于类型推断是根据参数列表从左到右进行的,故使用多个参数列表时,后面的参数可以使用前面参数推断出的类型。 3. 可以用最后一个参数列表来推断隐含参数(隐含参数是用implicit关键字声明的参数)。
Curry化也支持“方法可以拥有多个参数列表”的思想。
Curry化是指将接收多个参数的函数转换为接收多个参数列表函数(且每个参数列表中只有一个参数,也可以认为是转换为一系列只接受一个参数的一系列函数)的过程。如接收两个参数的函数Curry化后会变成一个接收一个参数的函数,此函数会返回一个以原来第二个参数作为参数的函数。
多参列表与Curry化的区别: 1. 多参数列表函数语法更具可读性。 2. Curry函数在作为偏应用函数时,不需要在后面加上下划线。
将一个带有多个参数的函数转化为Curry函数(需要使用偏应用函数的语法),并将一个Curry函数去Curry化的方法如下:
def cat(s1: String, s2: String) = s1 + s2 val catCurried = (cat _).curried //catCurried: String => (String => String) = <function1> val catUncurried = Function.uncurried(catCurried) //catUncurried: (String, String) => String = <function2>Curry化的一个实际用途:对于一个比较通用的函数,通过使用Curry化将其变成一个更专用的场景。
def multiplier(i: Int, factor: Int) = i * factor val multiplierCurried = (multiplier _).curried val byFive = multiplierCuried(5)参考《Scala程序设计》第二版
