这是一个励志的例子,给定:
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