当存在通配符情况时,使用orElse编写PartialFunction

问题描述 投票:2回答:2

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

例如,给定

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

scala function-composition
2个回答
6
投票

您可以通过执行第二个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)
  }
}

然后

(pf1 compfn pf2)(3)

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

© www.soinside.com 2019 - 2024. All rights reserved.