出现通配符时,用orElse组成PartialFunctions

时间:2019-04-26 14:08:30

标签: scala function-composition

当第一个函数具有与任何内容匹配的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,可以使用某些pf2compfn进行组合,以便我们生效

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

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

2 个答案:

答案 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)给出“通配符”)

相关问题