71

In python I can do this:

def f((a, b)):
    return a + b

d = (1, 2)
f(d)

Here the passed in tuple is being decomposed while its being passed to f.

Right now in scala I am doing this:

def f(ab: (Int, Int)): Int = {
    val (a, b) = ab
    a + b
}

val d = (1, 2)
f(d)

Is there something I can do here so that the decomposition happens while the arguments are passed in? Just curious.

Xavier Guihot
  • 54,987
  • 21
  • 291
  • 190
verma
  • 1,285
  • 1
  • 13
  • 19

3 Answers3

97

You can create a function and match its input with pattern matching:

scala> val f: ((Int, Int)) => Int = { case (a,b) => a+b }
f: ((Int, Int)) => Int

scala> f(1, 2)
res0: Int = 3

Or match the input of the method with the match keyword:

scala> def f(ab: (Int, Int)): Int = ab match { case (a,b) => a+b }
f: (ab: (Int, Int))Int

scala> f(1, 2)
res1: Int = 3

Another way is to use a function with two arguments and to "tuple" it:

scala> val f: (Int, Int) => Int = _+_
f: (Int, Int) => Int = <function2>

scala> val g = f.tupled // or Function.tupled(f)
g: ((Int, Int)) => Int = <function1>

scala> g(1, 2)
res10: Int = 3

// or with a method
scala> def f(a: Int, b: Int): Int = a+b
f: (a: Int, b: Int)Int

scala> val g = (f _).tupled // or Function.tupled(f _)
g: ((Int, Int)) => Int = <function1>

scala> g(1, 2)
res11: Int = 3

// or inlined
scala> val f: ((Int,Int)) => Int = Function.tupled(_+_)
f: ((Int, Int)) => Int = <function1>

scala> f(1, 2)
res12: Int = 3
kiritsuku
  • 52,967
  • 18
  • 114
  • 136
7

Starting in Scala 3, with the improved tupled function feature:

// val tuple = (1, 2)
// def f(a: Int, b: Int): Int = a + b
f.tupled(tuple)
// 3

Play with it in Scastie

Xavier Guihot
  • 54,987
  • 21
  • 291
  • 190
-1
object RandomExperiments extends App{
  def takeTuple(t:(Int,Int))=print (s"$t ${t._1}\n")
  takeTuple(1,3)
  takeTuple((1,3))
  takeTuple(((1,3)))

}

prints:

(1,3) 1
(1,3) 1
(1,3) 1
jhegedus
  • 20,244
  • 16
  • 99
  • 167
  • 2
    This is basically the same as Brian Agnews answer. But maybe it was an April fools joke? – Daniel Warmuth Dec 07 '18 at 08:27
  • The first one works because one can use in scala the syntax without parentheses. It is not calling takeTuple with two parameters, it is calling takeTuple with one tuple parameter without wrapping the parameter with parentheses (which was actually done in #2). – boggy May 15 '19 at 21:37
  • I have no idea of what you are trying to answer here. – IamDOM Feb 19 '23 at 17:57