scala:将元组作为函数的参数是不可能的

时间:2015-07-03 12:52:45

标签: scala tuples

我无法将元组作为方法参数传递:

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)

感谢。

4 个答案:

答案 0 :(得分:9)

就像函数文字一样:

(x:Int) => x + 1

是一个参数的函数,如下

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

是三个参数的函数,而不是3元组的一个参数

您可以使用case语句巧妙地完成这项工作:

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), ?)

另一种方法是传递元组,但由于所有_1个访问器,这真的很难看:

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), ?)

答案 1 :(得分:2)

lambda (a:Int,b:Int,c:Int) => (b,c,a+b)是一个带三个参数的函数。您希望它采用一个元组,因此您可以编写((a:Int,b:Int,c:Int)) => (b,c,a+b)。但这会产生错误!

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))
         ^

幸运的是,错误提示了一个解决方案:{ case (a, b, c) => (b, c, a+b) }

答案 2 :(得分:0)

也可以使用tupled选项:

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

答案 3 :(得分:-1)

我的猜测是表达式(a:Int,b:Int,c:Int) => (b,c,a+b)定义了一个带有三个参数的lambda,你需要一个分解的参数。