我无法将元组作为方法参数传递:
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)
感谢。
答案 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,你需要一个分解的参数。