3

したがって、次の「すべてをキャッチ」フォールバックを提供したいとします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 に答える