Scala中的偏函数与部分应用函数

Scala中有PartialFunction的概念, 同时还要一个概念叫Partial Applied Function. 前者译作偏函数, 后者译作"偏应用函数"或"部分应用函数", 一字之差, 差距很大.

首先偏函数是个数学概念, 偏函数不是"函数"的一种, 而是一个跟函数平行的概念.

Scala可以通过模式匹配来定义偏函数, 下面这两种方式定义的函数, 都可以认为是偏函数, 因为他们都只对其定义域Int的部分值做了处理. 那么像p1哪有定义成PartialFunction的额外好处是, 你可以在调用前使用一个isDefinedAt方法, 来校验参数是否会得到处理.  或者在调用时使用一个orElse方法, 该方法接受另一个偏函数,用来定义当参数未被偏函数捕获时该怎么做. 也就是能够进行显示的声明. 在实际代码中最好使用PartialFunction来声明你确实是要定义一个偏函数, 而不是漏掉了什么.

def p1:PartialFunction[Int, Int] = {
        case x if x > 1 => 1
    }

    def p2 = (x:Int) => x match {
        case x if x > 1 => 1
    }

而部分应用函数, 是指一个函数有N个参数, 而我们为其提供少于N个参数, 那就得到了一个部分应用函数.

比如我先定义一个函数:

def sum(a:Int,b:Int,c:Int) = a + b + c;

那么就可以从这个函数衍生出一个偏函数是这样的:

def p_sum = sum(1, _:Int, _:Int)

于是就可以这样调用p_sum(2,3), 相当于调用sum(1,2,3) 得到的结果是6. 这里的两个_分别对应函数sum对应位置的参数. 所以你也可以定义成

def p_sum = sum (_:Int, 1, _:Int) 

这东西有啥用呢? 一个是当你在代码中需要多次调用一个函数, 而其中的某个参数又总是一样的时候, 使用这个可以使你少敲一些代码

时间: 2024-10-09 19:55:33

Scala中的偏函数与部分应用函数的相关文章

第6节 Scala中的高阶函数:1、2、3、

Scala高级特性 1.    课程目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特性,我们通常将可以作为参数传递到方法中的表达式叫做函数.在函数式编程语言中,函数是“头等公民”,高阶函数包含:作为值的函数.匿名函数.闭包.柯里化等等. 2.2.   作为值的函数 可以像任何其他数据类型一样被传递和操作的函数,每当你想要给算法传入具体动作时这个特性就会变得非常有用. 定义函数时格式

scala入门教程:scala中的面向对象定义类,构造函数,继承

我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面一行代码就是一个scala类的定义: 首先是关键字class 其后是类名 Point 类名之后的括号中是构造函数的参数列表,这里相当于定义了对象的两个常量,其名称分别为x,y,类型都是Int 上面的类和下面的类是一致的,不过更精简了. class Point (xArg:Int, yArg:Int)

【转】scala解惑: 偏函数与部分应用函数

原文链接 http://www.cnblogs.com/nixil/archive/2012/05/16/2503722.html scala解惑: 偏函数与部分应用函数 scala中有PartialFunction的概念, 同时还要一个概念叫Partial Applied Function. 前者译作偏函数, 后者译作"偏应用函数"或"部分应用函数", 一字之差, 差距很大. 首先偏函数是个数学概念, 偏函数不是"函数"的一种, 而是一个跟函数

Scala中的函数

函数的定义: private      def  methodName(argName:Type,....) : Type 权限修饰符 定义方法的关键字 方法名 (参数名:参数类型) :返回值={ 方法体.. "" 返回值 } 在Scala中,定义函数,如果函数没有参数,可以把括号省略掉 scala> def max(x : Int, y :Int ): Int={ | if(x > y) x | else y | } max: (x: Int, y: Int)Int sc

scala中的高阶函数

高阶函数 val list =List(1,2,3,4,5,6,7,8) val newList = list.map((x:Int) => 2*x) //map表示映射list中的每一个元素的值为原来的2倍 //newList中的值为 2,4,6,8,10,12,14,16 也可直接写成 val newList = list.map(x => 2*x) 也可等价写成 val newList = list.map(2*_) map函数相当于foreach 集合Set val s = Set(1

Scala中的函数表达式

最近看Spark的东西,由于之前没有接触过lambda函数表达式,所以搜了点资料,特地纪录在此 Scala中的Lambda表达式 在函数式编程中,函数是基本的构造块.Scala融合了java中的面向对象编程和函数式编程.在Scala中,一个lambda表达式是种叫做“函数”或者“函数文本”.Scala中的函数属于一等公民.它们可以被分配给vals或者vars(最终变量或者非最终变量),它们可以作为其他函数的参数,也可以组合成新的函数. 在Scala中一个函数文本写成如下形式: ? 1 (argu

Scala中String.split函数

今天在写一个统计用户信息的程序时出现了bug,导致统计的结果根真实值有很大的差距.经过仔细检查以后,我发现时对scala中的split函数的理解不够透彻导致的.下面我讲详细解释split的参数及用法. 因为scala中的String复用了Java的String,因此这也是Java中String.split的用法. split函数主要有两种参数形式: def split(arg0: String): Array[String] def split(arg0: String, arg1: Int):

大数据学习之Scala中main函数的分析以及基本规则(2)

一.main函数的分析 首先来看我们在上一节最后看到的这个程序,我们先来简单的分析一下.有助于后面的学习 object HelloScala { def main(args: Array[String]): Unit = { println("I Love You Scala"); } } 如图所看到的,在Scala中能够使用object和class分别定义一个类.两者还是存在一些区别.以后我会在专门的博客中给予介绍. 在Scala中定义一个函数使用:def 来修饰 完整定义一个函数为

Scala中Zip相关的函数

在Scala中存在好几个Zip相关的函数,比如zip,zipAll,zipped 以及zipWithIndex等等.我们在代码中也经常看到这样的函数,这篇文章主要介绍一下这些函数的区别以及使用. 1.zip函数将传进来的两个参数中相应位置上的元素组成一个pair数组.如果其中一个参数元素比较长,那么多余的参数会被删掉.看下英文介绍吧: Returns a list formed from this list and another iterable collection by combining