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

原文链接 http://www.cnblogs.com/nixil/archive/2012/05/16/2503722.html

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

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

首先偏函数是个数学概念, 偏函数不是"函数"的一种, 而是一个跟函数平行的概念. 定义可参考wiki http://zh.wikipedia.org/wiki/%E5%87%BD%E6%95%B0 , 它是指定义域X中可能存在某些值在值域Y中没有对应的值.

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-08-25 19:04:02

【转】scala解惑: 偏函数与部分应用函数的相关文章

Scala之偏函数Partial Function

本文原文出处: http://blog.csdn.net/bluishglc/article/details/50995939 严禁任何形式的转载,否则将委托CSDN官方维护权益! 从使用case语句构造匿名函数谈起 在Scala里,我们可以使用case语句来创建一个匿名函数(函数字面量),这有别于一般的匿名函数创建方法.来看个例子: scala> List(1,2,3) map {case i:Int=>i+1} res1: List[Int] = List(2, 3, 4) 这很有趣,ca

快学Scala第2章–控制结构和函数 笔记

条件表达式 在Scala中,if/else 表达式是有值的,这个就是跟在if或者else之后的表达式的值.例如: val s = if(x > 0) 1 else -1 // 类似于 var s = 0 if(x > 0) s = 1 else s = -1 Scala允许使用混合类型的返回值,例如: if(x > 0) "positive" else -1 上式表达式返回的类型是它们类型的公共超类型, 在这里java.lang.String 和 Int 它们的公共超

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

Scala中有PartialFunction的概念, 同时还要一个概念叫Partial Applied Function. 前者译作偏函数, 后者译作"偏应用函数"或"部分应用函数", 一字之差, 差距很大. 首先偏函数是个数学概念, 偏函数不是"函数"的一种, 而是一个跟函数平行的概念. Scala可以通过模式匹配来定义偏函数, 下面这两种方式定义的函数, 都可以认为是偏函数, 因为他们都只对其定义域Int的部分值做了处理. 那么像p1哪有定义

Programming in Scala (Second Edition) 读书笔记6 函数和闭包

When programs get larger, you need some way to divide them into smaller, more manageable pieces. For dividing up control flow, Scala offers an approach familiar to all experienced programmers: divide the code into functions. In fact, Scala offers sev

scala学习手记29 - 偏应用函数

调用函数可以说成是将函数应用于实参.如果传入所有的预期的参数,就完全应用了这个函数.如果只传入几个参数,就会得到一个偏应用函数. 偏应用函数是一个特殊的概念,在scala中它是使用val定义的,但是在使用时它却更像是一个函数.偏应用函数的定义更接近于python中有默认值的函数(scala实在是和python有太多相似的地方了). 先来看一个例子: import java.util.Date def log(date: Date, message: String) { //... println

scala tail recursive优化,复用函数栈

在scala中如果一个函数在最后一步调用自己(必须完全调用自己,不能加其他额外运算子),那么在scala中会复用函数栈,这样递归调用就转化成了线性的调用,效率大大的提高.If a function calls itself as its last action, the function's stack frame can be reused. This is called tail recursion.=> Tail recursive functions are iterative proc

Scala类型声明与定义、函数定义、流程控制、异常处理

Scala源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库. Scala的基础类型基本与javascript一致. Scala的数据类型全部相同于Java中,具有相同的内存占用和精度.以下表是有关可在Scala中所有的数据类型的细节: 数据类型 描述 Byte 8位有符号值.范围从-128到127 Short 16位有符号值.范围从-32768至32767 Int 32 位有符号值.范围从 -2147483648 to 2147483647 Long 64位

2016.3.3(Spark框架预览,Scala部分应用函数、闭包、高阶函数,关于语义分析的一些心得)

一.Spark框架预览 主要有Core.GraphX.MLlib.Spark Streaming.Spark SQL等几部分. GraphX是进行图计算与图挖掘,其中主流的图计算框架现在有:Pregal.HAMA.Giraph(这几部分采用超步即同步的方式),而GraphLab与Spark GraphX采用异步的方式进行.它与Spark SQL进行协作时,一般是用SQL语句来进行ETL(Extract-Transform-Load数据仓库技术)然后交给GraphX处理. Spark SQL的前身

scala(一)方法&函数

写在前面 众所周知,scala一向宣称自己是面向函数的编程,(java表示不服,我是面向bean的编程!)那什么是函数? 在接触java的时候,有时候用函数来称呼某个method(实在找不出词了),有时候用方法来称呼某个method,虽然method的中文翻译就是“方法”,但对于java来说,方法和函数是等价的,或者说没有函数这个概念. 而对于scala,这两者似乎有一个较为明确的边界. 你会发现满世界的函数,而你却在写方法 Scala 方法&函数 方法 Scala的方法和java可以看成是一样