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

本人总结如下: 

部分应用函数 就是调用时少参数

偏函数是只表达了定义域的一部分。 scala中用scala.PartialFunction[-T, +S]类来表示

部分应用函数:def sum(x: Int)(y: Int) = x + y, 当调用sum的时候,调用时少参数,比如sum _ , sum(3)(_: Int), sum(_: Int)(3), 这样就生成了所谓的部分应用函数。部分应用函数只是逻辑上的一个表达,scala编译器会用Function1, Function2这些类来表示它.  

下面 定义一个偏函数:

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 为无效的点)

  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三个点的定义

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容