偏函数,也叫部分应用函数,就是调用的时候,只传入函数的部分参数。先举个例子就很容易明白了。
object PartialAppliedFunction { def main(args: Array[String]): Unit = { val part_sum = sum(1,_:Int,3) println(part_sum(2)) } def sum(a:Int,b:Int,c:Int)=a+b+c }
我们定义了一个函数sum,共有3个参数。 我们又定义了一个函数part_sum,它依赖于sum函数,但是只有部分的参数是用了占位符代替。那么当我们调用part_sum时,只需传入sum的未传入的参数即可。
及 part_sum(2) == sum(1,2,3)
这个就叫作部分应用函数。
我们知道,在scala中函数是一等公民,函数可以当成变量赋值给其他的变量或者函数。
那么我们看看如下语句
scala> def sum(a:Int,b:Int,c:Int)=a+b+c sum: (a: Int, b: Int, c: Int)Int scala> val sum3 = sum <console>:11: error: missing arguments for method sum; follow this method with `_‘ if you want to treat it as a partially applied function val sum3 = sum ^
直接将一个函数名称赋值给另一个变量,是会报错的。
其实我们想做的是:
scala> val sum3 = sum(_:Int,_:Int,_:Int) sum3: (Int, Int, Int) => Int = <function3>
Scala提供了一个简单的写法
scala> val sum3 = sum _ sum3: (Int, Int, Int) => Int = <function3>
就是部分应用函数的特殊情况,所有的参数都应用。
在视频中老师举了一个例子:
object PartialAppliedFunction { def main(args: Array[String]): Unit = { val data = List(1,2,3,4,5) data.foreach(println _) } }
其中
data.foreach(println _)
也是部分应用函数,开始时怎么也想不明白。这不是参数占位的写法嘛。其实这段代码应该这样理解
data.foreach() 应该传入一个函数作为参数 。 而 println _ 和sum _ 是类似的写法。
参数占位应该是这样写:
data.foreach(println(_))
本文出自 “叮咚” 博客,请务必保留此出处http://lqding.blog.51cto.com/9123978/1741829
第21讲: 偏函数(Partially applied function)实战详解
原文地址:http://lqding.blog.51cto.com/9123978/1741829