Если вы не хотите переписывать свою функцию для явного использования Tuple2 (как предложено пропущенным фактором и неизвестным пользователем), вы можете определить неявный метод, который сделает это автоматически. Это позволяет функции нетронутой (вы не обязаны всегда вызывать ее с параметром Tuple2) и легче для понимания, потому что вы все еще используете идентификаторы x и y.
implicit def fun2ToTuple[A,B,Res](f:(A,B)=>Res):((A,B))=>Res =
(t:(A,B)) => f(t._1, t._2)
val L = for (x <- (1 to 5)) yield (x, x * x)
val f = (x: Int, y: Int) => x > 3
val g = (x: Int, y: Int) => x % 2 > y % 3
L.filter(f) //> Vector((4,16), (5,25))
L.filter(g) //> Vector((3,9))
f(0,1) //> false
f((4,2)) //> true
Теперь каждая Function2 также может использоваться как Function1 с Tuple2 в качестве параметра, поскольку она использует неявный метод для преобразования функции при необходимости.
Для функций с более чем двумя параметрами неявное определение выглядит примерно так:
implicit def fun3ToTuple[A,B,C,Res](f:(A,B,C)=>Res):((A,B,C))=>Res =
(t:(A,B,C)) => f(t._1, t._2, t._3)
implicit def fun4ToTuple[A,B,C,D,Res](f:(A,B,C,D)=>Res):((A,B,C,D))=>Res =
(t:(A,B,C,D)) => f(t._1, t._2, t._3, t._4)
...