Scala偏函数与部分函数

函数

1.部分函数

部分应用函数(Partial Applied Function)是缺少部分参数的函数,是一个逻辑上概念。

def sum(x: Int, y: Int, z: Int) = x + y + z, 当调用sum的时候,如果不提供所有的参数,或者只提供某些参数时,比如sum _ , sum(3, _: Int, _:Int), sum(_: Int, 3, 4), 这样就生成了所谓的部分应用函数。

第一种形式(不推荐):

第一种定义形式:

def sum(x: Int)(y: Int)(z: Int) = x + y + z

这种定义形式和Java、C、C#都不一样,而且Scala的这种函数定义也不多见,同时用的时候比较容易和第二种定义形式的用法混淆。

第二种形式:

这种形式是常用的,推荐使用这种形式。

2.偏函数

在Scala中,偏函数是具有类型PartialFunction[-T,+V]的一种函数。T是其接受的函数类型,V是其返回的结果类型。偏函数最大的特点就是它只接受和处理其参数定义域的一个子集,而对于这个子集之外的参数则抛出运行时异常。这与Case语句的特性非常契合,因为我们在使用case语句是,常常是匹配一组具体的模式,最后用“_”来代表剩余的模式。如果一一组case语句没有涵盖所有的情况,那么这组case语句就可以被看做是一个偏函数。

如下面变量signal引用一个偏函数

val signal: PartialFunction[Int, Int] = {
    case x if x > 1 => 1
    case x if x < -1 => -1
}

这个signal所引用的函数除了0值外,对所有整数都定义了相应的操作。 signal(0) 会抛出异常,因此使用前最好先signal.isDefinedAt(0)判断一下。 偏函数主要用于这样一种场景:对某些值现在还无法给出具体的操作(即需求还不明朗),也有可能存在几种处理方式(视乎具体的需求);我们可以先对需求明确的部分进行定义,比如上述除了0外的所有整数域,然后根据具体情况补充对其他域的定义,如:

val composed_signal: PartialFunction[Int,Int] = signal.orElse{
    case 0 => 0
  }
composed_signal(0)  // 返回 0

或者对定义域进行一定的偏移(假如需求做了变更, 1 为无效的点),如:

val new_signal: Function1[Int, Int] = signal.compose{
    case x => x  - 1
  }

new_signal(1)  // throw exception
new_signal(0)   // 返回 -1
new_signal(2)  // 返回 1

还可以用andThen将两个相关的偏函数串接起来。

val another_signal: PartialFunction[Int, Int] = {
    case 0 =>  0
    case x if x > 0 => x - 1
    case x if x < 0 => x + 1
}

val then_signal =  another_signal andThen  signal

这里的then_signal 剔除了-1, 0, 1三个点的定义。

参考文献:

http://www.verydemo.com/demo_c161_i51144.html

《Scala编程》

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-05 18:31:00

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

scala偏函数

前言 在Spark中会经常看见一种在Java中没有的语法(此处Java特指Java8+),类似下面这样子的: pairs.filter{case (key, value) => value.length < 20} 在scala中函数是不支持元组作为参数的,因此就需要引入偏函数这个概念. 什么是偏函数 偏函数是一种可以对参数类型进行判断,从而选择合适的处理方式的语法. 偏函数的基本形式如下所示: val pf2:PartialFunction[Any,String]={case d:Doubl

scala偏函数小栗子

package cn.beicaiqm.scala.day04 /** * Created by Administrator on 2018/6/1. * 被包在花括号内没有match的一组case语句是一个偏函数, * 它是PartialFunction[-A, +B]的一个实例,A代表参 * 数类型,B代表返回类型 */ object Demo09PartialFunction { def main(args: Array[String]) { println(getInfo(20)) pr

scala 偏函数

package com.jason.qianfeng object PartialFuncTest { def div: PartialFunction[Int, Int] = { case i if i != 0 => 100 / i } def r1: PartialFunction[Int, String] = { case 1 => "one" case 2 => "two" case _ => "other" }

王家林 大数据Spark超经典视频链接全集[转]

压缩过的大数据Spark蘑菇云行动前置课程视频百度云分享链接 链接:http://pan.baidu.com/s/1cFqjQu SCALA专辑 Scala深入浅出经典视频 链接:http://pan.baidu.com/s/1i4Gh3Xb 密码:25jc DT大数据梦工厂大数据spark蘑菇云Scala语言全集(持续更新中) http://www.tudou.com/plcover/rd3LTMjBpZA/ 1 Spark视频王家林第1课:大数据时代的“黄金”语言Scala 2 Spark视

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

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

Scala 深入浅出实战经典 第67讲:Scala并发编程匿名Actor、消息传递、偏函数解析

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/LwsfuGIsWEk/优酷:http://v.youku.com/v_show/id_

scala并发编程原生线程Actor、Case Class下的消息传递和偏函数实战

参考代码: import scala.actors._ case class Person(name:String,age:Int) class HelloActor extends Actor{ def act(){ while(true){ receive{ case Person(name,age)=>{ //偏函数 println("Name: "+ name + ":" +"Age:" +age) sender ! "E

68:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析及其在Spark中的应用源码解析

今天给大家带来的是王家林老师的scala编程讲座的第68讲:Scala并发编程原生线程Actor.Cass Class下的消息传递和偏函数实战解析 昨天讲了Actor的匿名Actor及消息传递,那么我们今天来看一下原生线程Actor及CassClass下的消息传递,让我们从代码出发: case class Person(name:String,age:Int)//定义cass Class class HelloActor extends Actor{//预定义一个Actor  def act()

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