码迷,mamicode.com
首页 > 移动开发 > 详细

第21讲: 偏函数(Partially applied function)实战详解

时间:2016-02-13 23:17:03      阅读:575      评论:0      收藏:0      [点我收藏+]

标签:scala partial function

偏函数,也叫部分应用函数,就是调用的时候,只传入函数的部分参数。先举个例子就很容易明白了。

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)实战详解

标签:scala partial function

原文地址:http://lqding.blog.51cto.com/9123978/1741829

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!