文档章节

Scala 函数式编程_部分应用函数_Partially Applied Functions

秋风醉了
 秋风醉了
发布于 2015/04/24 19:07
字数 598
阅读 43
收藏 0
点赞 0
评论 0

Scala 函数式编程部分应用函数或函数的部分应用

和其他遵循函数式编程范式的语言一样,Scala 允许部分应用一个函数。 调用一个函数时,不是把函数需要的所有参数都传递给它,而是仅仅传递一部分,其他参数留空; 这样会生成一个新的函数,其参数列表由那些被留空的参数组成。(不要把这个概念和偏函数混淆)

何为部分应用函数?

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.

缺失的是函数需要的参数

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

代码如下,

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============

本文转载自:http://bit1129.iteye.com/blog/2187191

共有 人打赏支持
秋风醉了
粉丝 223
博文 581
码字总数 411013
作品 0
东城
程序员
Scala之Partially Applied Function和Currying

Partially Applied Function 在开始之前,还是让我们说说”apply”这个术语怎么解释吧。在scala里,我们认为:把一个参数传递给函数的过程就叫apply, 在传统的编程语言里,传递参数和调用函数...

bluishglc ⋅ 2016/04/02 ⋅ 0

Scala基础 - 函数和方法的区别

函数和方法 在Scala中函数是一等公民,你可以像操作数字一样将函数赋值给一个变量。使用val语句可以定义函数,def语句定义方法: 在Scala中无法直接操作方法,如果要操作方法,必须先将其转换...

joymufeng ⋅ 2016/04/04 ⋅ 0

Spark(七):局部套用和部分应用。

局部套用 和部分应用 是来源于数学的语言技术(基于 20 世纪数学家 Haskell Curry 和其他人的工作成果)。这两种技术存在于各种类型的语言中,可以单独或同时存在于函数式语言中。局部套用和...

牧羊人Berg ⋅ 2016/06/05 ⋅ 0

Scala之若干细小问题汇总

Scala中下划线的应用场景一 Scala中下划线的应用场景二 identity方法的应用场景 本文原文出处: http://blog.csdn.net/bluishglc/article/details/52806646 严禁任何形式的转载,否则将委托C...

bluishglc ⋅ 2016/10/13 ⋅ 0

在Scala中函数和方法有什么区别

方法可以作为一个表达式的一部分出现(调用函数并传参),但是方法(带参方法)不能作为最终的表达式, 但是函数可以作为最终的表达式出现: scala> //定义一个方法 scala> def m(x:Int) = ...

如风达 ⋅ 2015/08/28 ⋅ 0

scala 函数式编程

变换算子Transform scala> List(1,2,3,4,5).map(_2)res0: List[Int] = List(2, 4, 6, 8, 10) scala> List(1,2,3,4,5)reduceLeft{}res3: Int = 120 函数Closures (闭包) scala> var factor =......

MtrS ⋅ 2015/01/13 ⋅ 0

Scala基础 - 柯里化(Currying)及其应用

介绍 柯里化(currying, 以逻辑学家Haskell Brooks Curry的名字命名)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数作为参数的函数。在...

joymufeng ⋅ 2016/04/04 ⋅ 0

Scala Functions vs Methods

写在开头,今年不经意间接触到了scala语言,以前一直在使用java语言,现在对scala比较有兴趣,最近用业余时间在学习这方面知识,已经看完《快学scala》正在看《scala编程》,这边文章是我在其...

-悟空- ⋅ 2015/07/12 ⋅ 0

函数和闭包之偏应用函数

偏应用函数(Partial Applied Function)的定义:偏应用函数就是缺少部分或全部参数的函数。 尽管前面的例子里下划线(_)替代的只是单个参数,但你还可以使用单个下划线替换整个参数列表。再...

柳哥 ⋅ 2014/06/08 ⋅ 0

Scala 函数式编程_偏函数_Partial Functions

Scala 函数式编程偏函数Partial Functions 偏函数_Partial Functions 偏函数是只对函数定义域的一个子集进行定义的函数。 scala中用scala.PartialFunction[-T, +S] 类来表示。 比如,对给定的...

秋风醉了 ⋅ 2015/04/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

行政区划代码转为字典形式

原数据为: http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/201804-06041553.html 手动替换了一下格式,并使用下面的代码处理. # 输入格式s = """110000:北京市110101:东城区1101...

漫步海边小路 ⋅ 11分钟前 ⋅ 0

android apk 签名

创建key,需要用到keytool.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),把...

国仔饼 ⋅ 20分钟前 ⋅ 0

springcloud+jps+mybatis多数据库配置

多数据库配置 配置我们目录结构设置: config ---datasource ----jpa ----mybatis ----redis Datasource中是数据的相关配置 Jap中是springDatajpa的相关配置 Mybatis中是mybatis的相关配置 ...

大-智-若-愚 ⋅ 27分钟前 ⋅ 0

Spring mvc HandlerMapping 实现机制

概述 当DispatcherServlet接受到客户端的请求后,SpringMVC 通过 HandlerMapping 找到请求的Controller。 HandlerMapping 在这里起到路由的作用,负责找到请求的Controller。 Spring MVC 默认...

轨迹_ ⋅ 30分钟前 ⋅ 0

JavaScript零基础入门——(十)JavaScript的DOM基础

JavaScript零基础入门——(十)JavaScript的DOM基础 欢迎大家回到我们的JavaScript零基础入门,上一节课,我们了解了JavaScript中的函数,这一节课,我们来了解一下JavaScript的DOM。 第一节...

JandenMa ⋅ 今天 ⋅ 0

Weex起步

本教程假设你已经在你的本地环境安装了node 其实weex起步教程在 https://github.com/lilugirl/incubator-weex 项目说明文件中都已经有了,但为了有些同学看到英文秒变文盲,所以这里我重新写...

lilugirl ⋅ 今天 ⋅ 0

Jenkins实践1 之安装

1 下载 http://mirrors.jenkins.io/war/latest/jenkins.war 2 启动 java -jar jenkins.war 前提:安装jdk并配置环境变量 启动结果节选: ************************************************......

晨猫 ⋅ 今天 ⋅ 0

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 =...

阿豪boy ⋅ 今天 ⋅ 0

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 今天 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部