在已定义的情况下应用部分函数,在未定义的情况下应用其他函数



这是一个励志的例子,给定:

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

有没有办法将 Partial Function 仅应用于为其定义的元素?或以某种方式将 PF 与 Identity 复合。

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

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

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

有没有办法将 Partial Function 仅应用于为其定义的元素?或以某种方式将 PF 与 Identity 复合。

是的。

在这种情况下,几乎没有

理由检查你的偏函数在哪里定义和未定义,因为检查定义性所需的工作量将与总函数在弄清楚要做什么之前必须做的工作相同(即比较两个元素)。

但如果你真的想

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

相关内容

  • 没有找到相关文章

最新更新