Scala 函数式编程部分应用函数或函数的部分应用express
和其余遵循函数式编程范式的语言同样,Scala 容许部分应用一个函数。 调用一个函数时,不是把函数须要的全部参数都传递给它,而是仅仅传递一部分,其余参数留空; 这样会生成一个新的函数,其参数列表由那些被留空的参数组成。(不要把这个概念和偏函数混淆)编程
何为部分应用函数?数组
Partially Applied Function:app
A function that’s used in an expression and that misses some of its arguments.函数式编程
For instance, if function f has type Int => Int => Int, then f and f(1) are partially applied functions.函数
A partially applied function is an expression in which you don’t supply all of the arguments needed by the function. Instead, you supply some, or none, of the needed arguments.spa
缺失的是函数须要的参数scala
scala> def sum(a: Int, b: Int, c: Int) = a + b + c sum: (a: Int, b: Int, c: Int)Int scala> sum _ res1: (Int, Int, Int) => Int = <function3> scala> val a = sum _ a: (Int, Int, Int) => Int = <function3> scala> a(1,2,3) res2: Int = 6
代码以下,code
object PartialApplyFuncTest { def calc(a: Int, b: Int, c: Int) = a + b - c def main(args: Array[String]) { val list = List(1, 2, 3, 4, 5) list.foreach(println _) //缺失全部参数(只有一个) list.foreach(println(_)) //缺失一个参数(println实际上就一个参数) // list.foreach(println _)等价于list.foreach(x => println x) // list.foreach(println(_)),是否等价于list.foreach(println _)?等价 val print = println(_: Int) //调用print时,须要给定一个参数 list.foreach(print) //以下经过_定义的部分应用函数,必须为_指定类型 //val s0 = calc //编译错,参数个数缺失或者根本不存在无参的calc函数 val s00 = calc(1, 2, 4) //参数足够,直接调用 val s1 = calc(_: Int, 2, 3) //缺失第一个参数 val s2 = calc(_: Int, _: Int, 3) //缺失第一个,第二个参数 val s3 = calc(_: Int, 2, _: Int) //缺失第一个,第三个参数 val s4 = calc(_: Int, _: Int, _: Int) //缺失第一个,第二个和第三个参数 val s5 = calc _ //全部的参数列表都缺失(缺失第一个,第二个和第三个参数) println(s1(10)) println(s2(20, 30)) println(s3(10, 20)) println(s4(3, 2, 1)) println(s5(1, 3, 5)) //apply语法,s5(1,3,5)等价于s5.apply(1,3,5),apply方法将参数列表发送给s5指向的函数,进行调用 val f = (_: Int) + (_: Int) println(f(1, 2)) } }
============END============it