If you do not want to rewrite your function to use Tuple2 explicitly (as suggested by the missing factor and an unknown user), you can define an implicit method to do this automatically. This allows the function f to be untouched (you are not forced to always call it using the Tuple2 parameter) and is easier to understand because you still use the identifiers x and 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
Now each Function2 can also be used as function 1 with the Tuple2 as parameter, because it uses an implicit method to transform the function, if necessary.
For functions with more than two parameters, implicit defs look similar:
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) ...