文档章节

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

秋风醉了
 秋风醉了
发布于 2015/04/28 16:00
字数 373
阅读 55
收藏 0

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


偏函数_Partial Functions

偏函数是只对函数定义域的一个子集进行定义的函数。 scala中用scala.PartialFunction[-T, +S] 类来表示。

比如,对给定的输入参数类型,偏函数只能接受该类型的某些特定的值。一个定义为(Int) => String 的偏函数可能不能接受所有Int值为输入。

如下定义一个偏函数,这个函数只会接收 1 和 2 ,这两个输入。其他输入会报错。

val one: PartialFunction[Int, String] = {
  case 1 => "one"
  case 2 => "two"
}

println(one.isDefinedAt(1))

println(one.isDefinedAt(2))

println(one(1))
println(one(2))

运行并输出,

true

true

one

two

isDefinedAt表示 这个参数是否在函数的定义域中,否则抛出异常。

如下,

...........

...........

false

scala.MatchError: 3 (of class java.lang.Integer)

        at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:253)

        at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:251)

再来看一个例子,

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

println(signal(1212))
println(signal(-74567))
println(signal(0))

运行并输出,

C:\WorkSpace6-scala\scala-train\src\com\usoft>scala PartialFunction.scala

1

-1

scala.MatchError: 0 (of class java.lang.Integer)

        at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:253)


使用 orElse 组合函数

使用 orElse 组合函数

val one: PartialFunction[Int, String] = {
  case 1 => "one"
}
val two: PartialFunction[Int, String] = {
  case 2 => "two"
}
val three: PartialFunction[Int, String] = {
  case 3 => "three"
}
val wildcard: PartialFunction[Int, String] = {
  case _ => "something else"
}

val partial = one orElse two orElse three orElse wildcard

println(partial.isDefinedAt(4))
println(partial(4))

运行并输出,

C:\WorkSpace6-scala\scala-train\src\com\usoft>scala PartialFunction.scala

true

something else

=============END=============

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 232
博文 574
码字总数 405033
作品 0
朝阳
程序员
Scala基础 - 函数和方法的区别

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

joymufeng
2016/04/04
746
0
Scala 函数式编程_部分应用函数_Partially Applied Functions

Scala 函数式编程部分应用函数或函数的部分应用 和其他遵循函数式编程范式的语言一样,Scala 允许部分应用一个函数。 调用一个函数时,不是把函数需要的所有参数都传递给它,而是仅仅传递一部...

秋风醉了
2015/04/24
0
0
在下函数式编程有何贵干

函数式编程,一个一直以来都酷,很酷,非常酷的名词。虽然诞生很早也炒了很多年但是一直都没有造成很大的水花,不过近几年来随着多核,分布式,大数据的发展,函数式编程已经广泛投入到了实战...

力谱宿云
2016/07/07
779
8
为什么我们要学习Haskell这样的编程语言

最近的几个月,我一直在学习一种叫Haskell的编程语言。由于里面有太多的从未遇到的编程概念,整个过程就像是完全重新学习如何编程。在i.TV网站上,我写了很多JavaScript(node.js和前端代码)...

红薯
2012/04/11
3.5K
12
Spark(七):局部套用和部分应用。

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

牧羊人Berg
2016/06/05
42
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

angular 解决其他电脑不能访问的问题。

ng serve --host 0.0.0.0 --disable-host-check

miaojiangmin
今天
1
0
优酷视频文件怎么转换格式

  以前在优酷上下载视频都只是在手机上观看,但随着科技的发展,对于视频的要求也逐渐增多,不再只是观看视频那么简单,在精彩的部分还会将其单独分割出来,然后进行视频剪辑,可以做出我们...

萤火的萤火
今天
0
0
数据结构:散列

在一个数据结构中查找key元素,用顺序查找、二分查找都需要经过一系列关键之比较才能查找到结果,平均查找长度与数据量有关,元素越多比较次数就越多。 如果根据元素的关键字就能知道元素的存...

京一
今天
0
0
Apache RocketMQ 正式开源分布式事务消息

近日,Apache RocketMQ 社区正式发布4.3版本。此次发布不仅包括提升性能,减少内存使用等原有特性增强,还修复了部分社区提出的若干问题,更重要的是该版本开源了社区最为关心的分布式事务消...

阿里云云栖社区
今天
30
0
使用JavaScript和MQTT开发物联网应用

如果说Java和C#哪个是最好的开发语言,无疑会挑起程序员之间的相互怒怼,那如果说JavaScript是动态性最好的语言,相信大家都不会有太大的争议。随着越来越多的硬件平台和开发板开始支持JavaS...

少年不搬砖老大徒伤悲
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部