应用部分函数定义,不同函数不定义

时间:2014-12-09 17:10:44

标签: scala tuples partial-functions

这是一个动机的例子,鉴于:

List((1,2), (2,1), (3,1))

我想回复:

List((1,2),(3,1))

我试图以多种方式做到这一点。第一:

List((1,2), (2,1), (3,1)) map { case (a,b) => if (a > b) (a,b) else (b,a) } 
distinct

然后我尝试使用元组:

List((1,2), (3,4), (2,1)) map { t => if (t._1 <= t._2) t else t.swap }

然后稍微区别地定义部分功能:

val pf: PartialFunction[(Int,Int), (Int,Int)] = {
  case (i, j) if i >= j => (j, i)
}

List((1,2), (3,4), (2,1)) map pf distinct

有没有办法只将PartialFunction应用于定义的元素?或者在一些方法中将PF与身份复合。

1 个答案:

答案 0 :(得分:1)

为了完整起见,这是另一种形式

List((1,2), (2,1), (3,1)) map { case x@(i,j) => if (i >= j) (j,i) else x } distinct

这与其他几种形式基本相同。

  

有没有办法只将PartialFunction应用于定义的元素?或者在一些方法中将PF与身份复合。

是。 applyOrElse。

在这种情况下,没有理由检查你的部分功能在哪里,也没有定义,因为检查定义所需的工作量与总功能在确定什么之前必须完成的工作相同要做(即比较两个元素)。

但如果你真的想

List((1,2), (3,4), (2,1)) map {x => pf.applyOrElse(x, identity[(Int, Int)])} distinct