3

所以,假设,我想为 a 提供一个“包罗万象”的后备方案PartialFunction

 val foo: PartialFunction[Int, String] = { case 1 => "foo" }
 val withDefault = foo orElse { _.toString }

这不编译:missing parameter type for expanded function ((x$1) => x$1.toString)。这个:

  val withDefault = foo orElse { case x: Int => x.toString }

也不编译(同样的错误)。

这个:

val withDefault = foo orElse { (x: Int) => x.toString }

失败了type mismatch; found : Int => String; required: PartialFunction[?,?]

我能找到使它工作的唯一方法是拼出整个事情:

val withDefault = foo orElse PartialFunction[Int, String] { _.toString }

有没有更好的语法呢?我的意思是,不必告诉它我正在将一个部分函数从 int 传递到 string 到它期望从 in 接收到 string 的部分函数的位置。这一点都不含糊,我为什么要这样做?

4

2 回答 2

2

也许你需要applyOrElse

val withDefault = foo.applyOrElse(_: Int, (_: Int).toString)

或者你可能想要这样的东西:

implicit class PartialFunToFun[A,B](val f: PartialFunction[A,B]) extends AnyVal {
  def withDefault(bar: A => B) = f.applyOrElse[A,B](_: A, bar)
}

并使用它:foo.withDefault(_.toString)(1)

此外,如果您只想获得另一个PartialFunction,可以使用下一个语法:

val withDefault = foo.orElse[Int, String]{case x => x.toString}
于 2016-07-13T17:24:09.657 回答
0

您遇到的前两个错误并非特定于orElse. 当您尝试分别定义相同的函数时,它们也会发生。

scala> { _.toString }
<console>:12: error: missing parameter type for expanded function ((x$1: <error>) => x$1.toString)
       { _.toString }


scala> { case x: Int => x.toString }
<console>:12: error: missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: ?
       { case x: Int => x.toString }
       ^

对于最后一个,您正在定义一个函数而不是 PartialFunction,从而导致“类型不匹配”,因为orElse需要传递 PartialFunction。

scala> { (x: Int) => x.toString }
res3: Int => String = $$Lambda$1127/2044272973@3d5790ea

我要补充的最后一件事orElse是作为一种联合两个 PartialFunction 的方法。_.toString它本身不是 PartialFunction,尽管您可以创建一个使用它的 PartialFunction。对我来说,听起来您希望为所有未定义 foo 的值提供“默认”结果,因此我认为您实际上想要applyOrElse的是,因为这是它的用例。请参阅 API 以了解更多信息。

于 2016-07-13T18:36:32.710 回答