当存在通配符大小写时,使用 orElse 组合 PartFunctions



当第一个函数具有与任何因此实际上是全函数case _ =>匹配的通配符模式时,是否可以orElse组成两个PartialFunction

例如,给定

val pf1: PartialFunction[Int, String] = {
case 1 => "foo"
case 2 => "bar"
case _ => "wildcard"
}
val pf2: PartialFunction[Int, String] = {
case 3 => "baz"
case _ => "wildcard"
}

然后,开箱即用

(pf1 orElse pf2)(3)

输出wildcard.但是,假设我们不能修改pf1,我们是否可以使用一些compfnpf2进行组合,以便我们生效

{
case 1 => "foo"
case 2 => "bar"
case 3 => "baz"
case _ => "wildcard"
}

(pf1 compfn pf2)(3)在哪里输出baz

您可以通过执行第二个match将"通配符"结果转换为失败的匹配,从而将pf1转换为真正的分部函数。

val pf3: PartialFunction[Int, String] = (i: Int) => pf1(i) match {
case s if s != "wildcard" => s
}

然后

(pf3 orElse pf2)(3)

如果你想要你显示的精确语法,那么你需要使用一个隐式类:

implicit class addCompfn(f1: PartialFunction[Int, String]) {
def compfn(f2: PartialFunction[Int, String]) = (i: Int) => f1(i) match {
case s if s != "wildcard" => s
case s => f2(i)
}
}

然后

(pf1 compfn pf2)(3)

为什么不选择这样的东西:

val pf1: PartialFunction[Int, String] = {
case 1 => "foo"
case 2 => "bar"
}
val pf2: PartialFunction[Int, String] = {
case 3 => "baz"
}
def composeOrElseWildcard(input: Int) = (pf1 orElse pf2).applyOrElse(input,(_: Int) => "wildcard")

否则,对我来说,没有解决方案可以摆脱pf1中的通配符模式效果。

(composeOrElseWildcard(3)给出"baz",composeOrElseWildcard(4)给出"通配符")

最新更新