scala基础24-偏函数初探

本文探讨了Scala中的偏函数(PartialFunction)与部分应用函数(PartialAppliedFunction)的概念。通过具体的代码示例,解释了如何定义和使用这两种函数,并讨论了它们之间的主要区别。此外,还介绍了部分应用函数在减少重复代码方面的作用。
object Test {

  def main(args: Array[String]): Unit = {
    def sum(a: Int, b: Int, c: Int) = a + b + c
    println(sum(1, 2, 3))

    val fp_a = sum _
    println(fp_a(1, 2, 3))
    println(fp_a.apply(1, 2, 3))

    /*
     * 目前暂时的理解:偏函数是因为某个函数的某个参数经常是固定值
     * 那么自定义个偏函数,方便使用
     */
    val fp_b = sum(1, _: Int, 3)
    println(fp_b(2))
    println(fp_b(10))
  }
}


附:

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

首先偏函数是个数学概念, 偏函数不是"函数"的一种, 而是一个跟函数平行的概念.  它是指定义域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) 

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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值