定義性をテストし、同時に評価する
それはapplyOrElse
です。二重評価を回避するために使用されcollect
ます。lift
この再帰的なバージョンは、次の関数を適用して結果を構築するために使用するか、続行して残りの結果を構築することを示しています。
def f(ff: List[PartialFunction[Any, Int]]): List[Int] = ff match {
case hd :: tail => hd.applyOrElse(num, (_: Any) => return f(tail)) :: f(tail)
case _ => Nil
}
return
Scalaで使ったのは初めてです。索引で調べる必要がありました。
この手動の構築により、 でのオブジェクトの作成とLifted
、 のOption
適応が回避されOption
ます。
scala> :pa
// Entering paste mode (ctrl-D to finish)
val funcs: Seq[PartialFunction[Any, Int]] = Vector(
{ case i: Int if i % 2 == 0 => i*2 }
,
{ case i: Int if i % 2 == 1 => i*3 }
,
{ case i: Int if i % 6 == 0 => i*5 }
)
val num = 66
def f(ff: List[PartialFunction[Any, Int]]): List[Int] = ff match {
case hd :: tail => hd.applyOrElse(num, (_: Any) => return f(tail)) :: f(tail)
case _ => Nil
}
// Exiting paste mode, now interpreting.
funcs: Seq[PartialFunction[Any,Int]] = Vector(<function1>, <function1>, <function1>)
num: Int = 66
f: (ff: List[PartialFunction[Any,Int]])List[Int]
scala> f(funcs.toList)
res0: List[Int] = List(132, 330)
scala> funcs flatMap (_ lift num)
res1: Seq[Int] = Vector(132, 330)
2 番目のバージョンは、同じアイデアに対してフラグを使用するだけです。
scala> :pa
// Entering paste mode (ctrl-D to finish)
def f(ff: List[PartialFunction[Any, Int]]): List[Int] = ff match {
case hd :: tail =>
var ok = true
val x = hd.applyOrElse(num, (_: Any) => { ok = false ; 0 })
if (ok) x :: f(tail) else f(tail)
case _ => Nil
}
// Exiting paste mode, now interpreting.
f: (ff: List[PartialFunction[Any,Int]])List[Int]
scala> f(funcs.toList)
res2: List[Int] = List(132, 330)