码迷,mamicode.com
首页 > 其他好文 > 详细

Scala偏函数与部分函数

时间:2015-08-02 15:20:00      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:scala   偏函数   部分函数   

函数

1.部分函数

部分应用函数(Partial Applied Function)是缺少部分参数的函数,是一个逻辑上概念。
def sum(x: Int, y: Int, z: Int) = x + y + z, 当调用sum的时候,如果不提供所有的参数,或者只提供某些参数时,比如sum _ , sum(3, _: Int, _:Int), sum(_: Int, 3, 4), 这样就生成了所谓的部分应用函数。

第一种形式(不推荐):

技术分享

技术分享

技术分享

技术分享

第一种定义形式:

def sum(x: Int)(y: Int)(z: Int) = x + y + z
这种定义形式和Java、C、C#都不一样,而且Scala的这种函数定义也不多见,同时用的时候比较容易和第二种定义形式的用法混淆。

第二种形式:
技术分享

技术分享

技术分享

这种形式是常用的,推荐使用这种形式。

2.偏函数

在Scala中,偏函数是具有类型PartialFunction[-T,+V]的一种函数。T是其接受的函数类型,V是其返回的结果类型。偏函数最大的特点就是它只接受和处理其参数定义域的一个子集,而对于这个子集之外的参数则抛出运行时异常。这与Case语句的特性非常契合,因为我们在使用case语句是,常常是匹配一组具体的模式,最后用“_”来代表剩余的模式。如果一一组case语句没有涵盖所有的情况,那么这组case语句就可以被看做是一个偏函数。
如下面变量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三个点的定义。


参考文献:

http://www.verydemo.com/demo_c161_i51144.html
《Scala编程》


版权声明:本文为博主原创文章,未经博主允许不得转载。

Scala偏函数与部分函数

标签:scala   偏函数   部分函数   

原文地址:http://blog.csdn.net/u010376788/article/details/47206571

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!