ラムダを取り、.tupled
可能であればそれを使用する関数を作成しています(アリティ2+)。コンパイラがそれを使用できるようにするには、ラムダが本当に Function2 (~ Function22) であるかどうかを知る必要があります。ただし、 for のパターン マッチングは、元の型ではなくFunction2[Any,Any,Any]
a が残っていることを意味します。(Any, Any) => Any
アリティを知らなくても役に立ちません。型を保持するためにマッチングをcase f[A <: Any, B <: Any, C <: Any]: scala.Function2[A, B, C] => f.tupled
試みましたが、ケースの型パラメーターは実際には許可されていません。
コード:
val add = (a: Int, b: Int) => a + b
add: (Int, Int) => Int = <function2>
val tpl = (fn: Any) => {
fn match {
case f: Function0[Any] => f
case f: Function1[Any,Any] => f
case f: Function2[Any,Any,Any] => f.tupled
// case f: Function3[Any,Any,Any,Any] => f.tupled
// ...
// case _ => { throw new Exception("huh") }
}
}
// actual result:
tpl(add)
res0: Any = <function1>
// desired result is like this one:
scala> add.tupled
res3: ((Int, Int)) => Int = <function1>
可能性のある各レベルのパターン マッチング ケースが必要ない場合のボーナス ポイント...