scala中的部分应用函数和偏函数的区别

简介:

之前学习Scala编程语言时, 经常把部分应用函数(Partial Applied Function)偏函数(Partial Function) 搞混。

这里做个简单的总结

以下的讨论基于 scala 2.8

部分应用函数(Partial Applied Function)是缺少部分参数的函数,是一个逻辑上概念
偏函数是(Partical Function)只对函数定义域的一个子集进行定义的函数。 scala中用scala.PartialFunction[-T, +S]类来表示
比如定义了一个函数:def sum(x: Int)(y: Int) = x + y, 当调用sum的时候,如果不提供所有的参数或某些参数还未知时,比如sum _ , sum(3)(_: Int), sum(_: Int)(3), 这样就生成了所谓的部分应用函数。部分应用函数只是逻辑上的一个表达,scala编译器会用Function1Function2这些类来表示它.

下面这个变量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三个点的定义

相关文章
|
8月前
|
分布式计算 Scala Spark
Scala【集合常用方法和函数操作(下)】
Scala【集合常用方法和函数操作(下)】
|
8月前
|
分布式计算 Scala Spark
Scala 【集合常用方法和函数操作-上】
Scala 【集合常用方法和函数操作-上】
|
2月前
|
Java Scala
Scala 方法与函数
Scala 方法与函数
25 1
|
8月前
|
SQL Java 关系型数据库
Scala应用 —— JDBC的创建
这篇文章介绍了如何使用Scala实现JDBC连接。首先,通过在pom.xml添加MySQL JDBC驱动依赖,然后使用`Class.forName()`加载驱动,接着创建连接对象。初始化执行器涉及创建执行器对象和设置参数。执行操作时,根据DML(数据修改语言)和DQL(数据查询语言)返回不同结果。文章提出了一个柯里化的`jdbc`函数,以处理不同操作步骤和多类型结果。结果类型通过枚举和抽象类`Three`的子类来表示,包括异常、DML影响行数和DQL查询结果。最后,展示了`jdbc`方法的实现,以及如何处理结果并转换为具体对象。代码示例中,查询结果被转换为`Test`对象数组并打印。
105 2
Scala应用 —— JDBC的创建
|
8月前
|
数据采集 JSON 数据处理
一步步实现知乎热榜采集:Scala与Sttp库的应用
使用Scala和Sttp库,结合代理IP,本文阐述了爬取并处理知乎热榜数据的方法。首先,确保安装Scala和SBT,然后在`build.sbt`引入Sttp等相关依赖。代码中,设置代理服务器信息、User-Agent和Cookie,发送GET请求获取数据。解析JSON数据后,归类和统计不同类型条目的数量,例如文章和问题。运行示例输出归类和统计结果,为数据分析提供基础。
一步步实现知乎热榜采集:Scala与Sttp库的应用
|
8月前
|
编译器 Scala
认识scala中的函数
认识scala中的函数
76 5
|
7月前
|
Scala
scala-模式匹配(字符串、数组、元组、集合、类、偏函数)
scala-模式匹配(字符串、数组、元组、集合、类、偏函数)
32 0
|
8月前
|
Scala
Scala函数和方法
Scala函数和方法
41 1
|
8月前
|
分布式计算 Java 大数据
Scala:样例类、模式匹配、Option、偏函数、泛型(三)
Scala:样例类、模式匹配、Option、偏函数、泛型(三)
87 0
|
机器学习/深度学习 分布式计算 Java
Scala方法和函数
Scala方法和函数
105 0