Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

scala tuple unpacking

I know this question has come up many times in different ways. But it is still not clear to me. Is there a way to achieve the following.

def foo(a:Int, b:Int) = {}  foo(a,b) //right way to invoke foo  foo(getParams) // is there a way to get this working without explicitly unpacking the tuple??  def getParams = {    //Some calculations    (a,b)  //where a & b are Int } 
like image 407
scout Avatar asked Aug 25 '10 16:08

scout


2 Answers

It's a two step procedure. First turn foo into a function, then call tupled on it to make it a function of a tuple.

(foo _).tupled(getParams) 
like image 153
Dave Griffith Avatar answered Sep 21 '22 23:09

Dave Griffith


@dave-griffith is dead on.

You can also call:

Function.tupled(foo _) 

If you want to wander into "way more information than I asked for" territory, there are also methods built into partially applied functions (and on Function) for currying. A few input/output examples:

scala> def foo(x: Int, y: Double) = x * y foo: (x: Int,y: Double)Double  scala> foo _ res0: (Int, Double) => Double = <function2>  scala> foo _ tupled res1: ((Int, Double)) => Double = <function1>  scala> foo _ curried res2: (Int) => (Double) => Double = <function1>  scala> Function.tupled(foo _) res3: ((Int, Double)) => Double = <function1>  // Function.curried is deprecated scala> Function.curried(foo _) warning: there were deprecation warnings; re-run with -deprecation for details res6: (Int) => (Double) => Double = <function1> 

Wherein the curried version is invoked with multiple argument lists:

scala> val c = foo _ curried c: (Int) => (Double) => Double = <function1>  scala> c(5) res13: (Double) => Double = <function1>  scala> c(5)(10) res14: Double = 50.0 

Finally, you can also uncurry/untuple if needed. Function has builtins for this:

scala> val f = foo _ tupled f: ((Int, Double)) => Double = <function1>  scala> val c = foo _ curried c: (Int) => (Double) => Double = <function1>  scala> Function.uncurried(c) res9: (Int, Double) => Double = <function2>  scala> Function.untupled(f) res12: (Int, Double) => Double = <function2> 

like image 35
Brendan W. McAdams Avatar answered Sep 23 '22 23:09

Brendan W. McAdams