2015-07-03 19 views
4

我不能傳遞一個元組作爲方法參數:階:這是不可能把一個元組作爲函數的參數

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) 

感謝。

回答

8

正如函數文本:

(x:Int) => x + 1 

是一個參數的函數,下面

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

是三個參數的函數,一個3tuple沒有一個說法

您可以使用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), ?) 
+0

它的工作原理,謝謝。事實上,我嘗試過這樣的事情(使用案例),但我沒有把案件放在大括號之間。爲什麼簡單的括號不起作用? – lolveley

+0

@lolveley因爲'case'不是一個簡單的表達式,這是'()'參數列表中允許的所有內容 – Daenyth

-1

我的猜測是表達式(a:Int,b:Int,c:Int) => (b,c,a+b)定義了一個帶有三個參數的lambda表達式,並且您需要一個分解的參數。

2

拉姆達(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) }

相關問題