当第一个函数具有与任何内容匹配的orElse
通配符模式时,PartialFunction
是否可以组成两个case _ =>
,
例如,给定
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
,可以使用某些pf2
与compfn
进行组合,以便我们生效
{
case 1 => "foo"
case 2 => "bar"
case 3 => "baz"
case _ => "wildcard"
}
(pf1 compfn pf2)(3)
将在哪里输出baz
?
答案 0 :(得分:6)
通过执行第二次newline
将“通配符”结果转换为失败的匹配,您可以将pf1
变成真正的部分函数。
match
然后
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)
}
}
答案 1 :(得分:0)
为什么不选择这样的东西:
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)
给出“通配符”)