Я делаю функцию, которая принимает лямбду и использует .tupled
, если это возможно (арность 2+). Чтобы компилятор разрешил это использовать, ему нужно знать, действительно ли лямбда является функцией Function2 (~ Function22). Однако сопоставление с образцом для Function2[Any,Any,Any]
означает, что я остаюсь с (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>
Бонусные баллы, если мне не понадобятся случаи сопоставления с образцом для каждого возможного уровня арности...
Function1[(A, B)]
?Function1[(A, B, C)]
?Function[(A, B, C, D)]
? - person dcastro   schedule 07.09.2015