何为部分应用函数?
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函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。 从OOP到FP,思路的转化 ...
函数式编程(FP)是一种...《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。
第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页 第7讲-Scala编程详解:函数入门之变长参数 共4页 第8讲-Scala编程详解:函数入门之过程、lazy值和异常 共5页 第9讲-...
2前言留代码的开发者回来彻底修复该问题前保持数据不被污染。我将编写的用于解决该问题的小程序转交给了运维团队,他们将该程序运行在了一个 JVM 的安全区域。至此,
英文原版 scala函数式编程 function programming in scala
详细讲解Scala中的高阶函数部分,具体实例剖析Scala中高阶函数的意义所在,对控制抽象进行了详细的说明,参考书籍《快学Scala》、《Programming in Scala》
目前很多大数据组件都是用scala开发,包括Spark, Kafka, Flink,scala的函数式编程思想能够带来比java更高的效率,同时其可读性及难度升高,文档由浅入深介绍Scala的语法、特性等;
第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页 第7讲-Scala编程详解:函数入门之变长参数 共4页 第8讲-Scala编程详解:函数入门之过程、lazy值和异常 共5页 第9讲-...
第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页 第7讲-Scala编程详解:函数入门之变长参数 共4页 第8讲-Scala编程详解:函数入门之过程、lazy值和异常 共5页 第9讲-...
第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页 第7讲-Scala编程详解:函数入门之变长参数 共4页 第8讲-Scala编程详解:函数入门之过程、lazy值和异常 共5页 第9讲-...
第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页 第7讲-Scala编程详解:函数入门之变长参数 共4页 第8讲-Scala编程详解:函数入门之过程、lazy值和异常 共5页 第9讲-...
第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页 第7讲-Scala编程详解:函数入门之变长参数 共4页 第8讲-Scala编程详解:函数入门之过程、lazy值和异常 共5页 第9讲-...
第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页 第7讲-Scala编程详解:函数入门之变长参数 共4页 第8讲-Scala编程详解:函数入门之过程、lazy值和异常 共5页 第9讲-...
scala是一种基于JVM的面向对象的函数编程,scala编程相对于java而言代码整洁、开发效率更高。 其中scala优点主要有: 1:面向对象,可以定义class,通过new调用实例对象使用。 2:兼容java,在scala中可以直接调用...
第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页 第7讲-Scala编程详解:函数入门之变长参数 共4页 第8讲-Scala编程详解:函数入门之过程、lazy值和异常 共5页 第9讲-...
第三部分介绍在 Scala 中如何进行并 发编程,并务实地介绍 Akka 套件;第四部分通过实战练习对前面的知识进行综合应用,并 系统地介绍如何与 Java 进行互操作。此外,附录部分还包括一些额外指引。 本书的目标读者是...
本文详细的介绍了scala的函数,对于入门者来说是一个很好的启蒙教材
一、部分应用函数 二、偏函数 一、部分应用函数 二、偏函数