博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】scala解惑: 偏函数与部分应用函数
阅读量:5262 次
发布时间:2019-06-14

本文共 1969 字,大约阅读时间需要 6 分钟。

def test = {    val x = 1    x match {      case x if x > 0 => println(s" x=$x if x > 0")    }  }  def p1: PartialFunction[Int, Int] = {    case x if x > 1 => 1  }  def test2 = {    val sample = 1 to 10    val isEven: PartialFunction[Int, String] = {      case x if x % 2 == 0 => x + " is even"    }        var ifDefine = isEven.isDefinedAt(1)    println(s"isEven.isDefinedAt(1)  $ifDefine")    ifDefine = isEven.isDefinedAt(2)    println(s"isEven.isDefinedAt(2)  $ifDefine")    // the method collect can use isDefinedAt to select which members to collect    val evenNumbers = sample collect isEven    println(s"sample collect isEven  $evenNumbers")    val isOdd: PartialFunction[Int, String] = {      case x if x % 2 == 1 => x + " is odd"    }    // the method orElse allows chaining another partial function to handle    // input outside the declared domain    val numbers = sample map (isEven orElse isOdd)  }  def f(x: Int, y: Int, z: Int) = List(x, y, z).sum    def f1 = f(100, _: Int, _: Int)

 

原文链接

 

scala中有PartialFunction的概念, 同时还要一个概念叫Partial Applied Function.

前者译作偏函数, 后者译作"偏应用函数"或"部分应用函数", 一字之差, 差距很大.

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

定义可参考wiki  , 它是指

定义域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)

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

 

 

 

转载于:https://www.cnblogs.com/ihongyan/p/4818432.html

你可能感兴趣的文章
线程池的概念
查看>>
Oracle_Statspack性能诊断工具
查看>>
转获取sql维护的表关系
查看>>
Java 序列化
查看>>
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>
mysql启动过程
查看>>
2017前端面试题总结
查看>>
Http GetPost网络请求
查看>>
SWIFT国际资金清算系统
查看>>
Sping注解:注解和含义
查看>>
站立会议第四天
查看>>
如何快速掌握一门技术
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
vagrant 同时设置多个同步目录
查看>>
python接口自动化28-requests-html爬虫框架
查看>>
生成随机数的模板
查看>>
hdu 2093
查看>>
Mysql 数据库操作
查看>>