当前位置:首页 > 开发 > 编程语言 > Scala > 正文

【Scala十三】Scala核心七:部分应用函数

发表于: 2015-02-27   作者:bit1129   来源:转载   浏览:
摘要: 何为部分应用函数? Partially applied function: 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 p

何为部分应用函数?

Partially applied function: 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.

缺失的是函数需要的参数

 

 

 

将函数应用(apply)于方法:

In Scala, when you invoke a function, passing in any needed arguments, you apply that function to the arguments

 

 

package spark.examples.scala.partialapplyfunc


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 _) //缺失所有参数(因为println函数只有一个参数,因此println _所有参数等价于println(_)缺失一个参数)
    list.foreach(println(_)) //缺失一个参数(println实际上就一个参数)
    // list.foreach(println _)等价于list.foreach(x => println x)
    // list.foreach(println(_)),是否等价于list.foreach(println _)?等价

    val print = println(_: Int) //声明时,需要为缺失的参数指定类型,上面不需要是因为可以从list中推导出来
    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))
  }
}

 

 问题:

定义val s1 = calc(_:Int, 2,3)时为什么一定要为缺失的参数指定类型,而val s5 = calc _则不需要?因为calc的第一个参数类型是确定的,为什么这里还需要再给定类型?

 

scala>   def calc(a: Int, b: Int, c: Int) = a + b - c
calc: (a: Int, b: Int, c: Int)Int

scala> calc _
res5: (Int, Int, Int) => Int = <function3>

scala> calc(1,2,_)
<console>:9: error: missing parameter type for expanded function ((x$1) => calc(1, 2, x$1))
              calc(1,2,_)
                       ^

scala> calc(1,2,_:Int)
res7: Int => Int = <function1>

scala>

 

 

 

 

 

 

 

 

 

 

 

 

【Scala十三】Scala核心七:部分应用函数

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
环境: CentOS 6.3 看例子,说实话。 入门函数: scala> def max(x: Int,y: Int): Int = { | if
Scala中继承&练习 1. 扩展如下的BankAccount类,新类CheckingAccount对每次存款和取款都收取1美元的
我们做spark开发 会使用很多spark的高阶函数 所以 今天我就在linux服务上使用scala高阶函数 声明一
我们做spark开发 会使用很多spark的高阶函数 所以 今天我就在linux服务上使用scala高阶函数 声明一
我们做spark开发 会使用很多spark的高阶函数 所以 今天我就在linux服务上使用scala高阶函数 声明一
我们做spark开发 会使用很多spark的高阶函数 所以 今天我就在linux服务上使用scala高阶函数 声明一
胜败兵家事不期,包羞忍耻是男儿——斗牛士fighting,fighting,fighting... 小象学习和使用scala也
胜败兵家事不期,包羞忍耻是男儿——斗牛士fighting,fighting,fighting... 小象学习和使用scala也
胜败兵家事不期,包羞忍耻是男儿——斗牛士fighting,fighting,fighting... 小象学习和使用scala也
/** * Created by corleone on 2016/1/3. */ object new_in_3 extends App { //写法一,始终待返回
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号