这可以相当直接地使用shapeless 的工具来抽象函数的数量,
import shapeless._
import HList._
import Functions._
def wrap_fun[F, T <: HList, R](f : F)
(implicit
hl : FnHListerAux[F, (Int :: T) => R],
unhl : FnUnHListerAux[(Int :: T) => R, F]) =
((x : Int :: T) => f.hlisted(x.head*2 :: x.tail)).unhlisted
val f1 = wrap_fun(fun _)
val f2 = wrap_fun(fun1 _)
val f3 = wrap_fun(fun2 _)
示例 REPL 会话,
scala> f1(2)
res0: Int = 4
scala> f2(2, 4)
res1: Int = 4
scala> f3(2, Map(), Seq())
res2: Int = 4
请注意,您不能立即应用包装函数(如问题所示),而不是通过分配的 val (正如我在上面所做的那样),因为包装函数的显式参数列表将与wrap_fun
. 我们可以得到的最接近问题形式的方法是明确命名apply
方法,如下所示,
scala> wrap_fun(fun _).apply(2)
res3: Int = 4
scala> wrap_fun(fun1 _).apply(2, 4)
res4: Int = 4
scala> wrap_fun(fun2 _).apply(2, Map(), Seq())
res5: Int = 4
在这里,明确提及的apply
语法将第一个应用程序(wrap_fun
及其隐式参数列表)与第二个应用程序(转换后的函数及其显式参数列表)分开。