我正在制作一个带有 lambda 的函数,并.tupled
在可能的情况下使用它(arity 2+)。为了让编译器允许使用它,它需要知道 lambda 是否真的是 Function2(~ Function22)。但是,模式匹配Function2[Any,Any,Any]
意味着我只剩下 a(Any, Any) => Any
而不是它的原始类型。甚至不知道arity也无济于事。我尝试进行匹配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>
如果我不需要每个可能的arity级别的模式匹配案例,那么加分......