Преобразование функций Scala

Скажем, у меня есть функция, принимающая один аргумент

def fun(x: Int) = x

Основываясь на этом, я хочу сгенерировать новую функцию с тем же соглашение о вызовах, но это применит некоторое преобразование к его аргументам перед делегированием исходной функции. Для этого я мог

def wrap_fun(f: (Int) => Int) = (x: Int) => f(x * 2)
wrap_fun(fun)(2) // 4

Как можно сделать то же самое, кроме как для функций любой арности, которые имеют только ту часть аргументов, к которой нужно применить преобразование?

def fun1(x: Int, y: Int) = x
def fun2(x: Int, foo: Map[Int,Str], bar: Seq[Seq[Int]]) = x

wrap_fun(fun1)(2, 4) // 4
wrap_fun(fun2)(2, Map(), Seq()) // 4

Как будет выглядеть определение wrap_fun, заставляющее вышеперечисленные вызовы работать?

6
задан rafl 18 April 2012 в 19:11
поделиться