lolveley
lolveley

Reputation: 1709

scala : it is impossible to put a tuple as a function's argument

I can't pass a tuple as a method parameter:

scala> val c:Stream[(Int,Int,Int)]= Stream.iterate((1, 0, 1))((a:Int,b:Int,c:Int) => (b,c,a+b))
<console>:11: error: type mismatch;
 found   : (Int, Int, Int) => (Int, Int, Int)
 required: ((Int, Int, Int)) => (Int, Int, Int)

thanks.

Upvotes: 9

Views: 7600

Answers (4)

morgen
morgen

Reputation: 11

It is also possible to use the tupled option:

def a = (x:Int, y: Int, z: Int) => x + y + z).tupled
val sum = a((1,2,3))

Upvotes: 1

DNA
DNA

Reputation: 42597

Just as the function literal:

(x:Int) => x + 1

is a function of one argument, the following

(x:Int, y: Int, z: Int) => x + y + z

is a function of three arguments, not one argument of a 3tuple

You can make this work neatly using a case statement:

scala> val c: Stream[(Int,Int,Int)] = 
       Stream.iterate((1, 0, 1)){ case (a, b, c) => (b, c, a+b) }

c: Stream[(Int, Int, Int)] = Stream((1,0,1), ?)

An alternative is to pass the tuple, but that's really ugly due to all the _1 accessors:

scala> val c:Stream[(Int,Int,Int)] = 
         Stream.iterate((1, 0, 1))( t => (t._2, t._3, t._1 + t._2) )

c: Stream[(Int, Int, Int)] = Stream((1,0,1), ?)

Upvotes: 11

ReyCharles
ReyCharles

Reputation: 1792

The lambda (a:Int,b:Int,c:Int) => (b,c,a+b) is a function taking three arguments. You want it to take one tuple, so you can write ((a:Int,b:Int,c:Int)) => (b,c,a+b). But this gives an error!

error: not a legal formal parameter.
Note: Tuples cannot be directly destructured in method or function parameters.
      Either create a single parameter accepting the Tuple3,
      or consider a pattern matching anonymous function: `{ case (param1, ..., param3) => ... }
       (((a:Int,b:Int,c:Int)) => (b,c,a+b))
         ^

Luckily, the error suggests a solution: { case (a, b, c) => (b, c, a+b) }

Upvotes: 4

Tassos Bassoukos
Tassos Bassoukos

Reputation: 16142

My guess is that the expression (a:Int,b:Int,c:Int) => (b,c,a+b) defines a lambda with three arguments, and you need one decomposed argument.

Upvotes: -1

Related Questions