2011-11-29 82 views
6

這些有什麼區別?我知道他們的類型簽名是不同的,並且所有函數都是正常的,並且必須是.tupled才能獲得它們的元組形式。使用un-tupled(但非curry)函數的優點是什麼?特別是因爲在我看來,將多個參數傳遞給一個元組函數會自動將它們解包,因此所有外觀都是相同的。Scala:普通函數與元組函數?

一個區別我看到的是,它迫使你有類型的函數參數每隔數:Function0Function1Function2Function3等,而tupled功能都只是Function1[A, R],但是這似乎是一個缺點。使用非元組函數的最大優點是它們是默認函數?

回答

7

元組函數要求在調用元組對象時創建元組對象(除非參數已經被打包到元組中)。非元組函數只是簡單地定義了一個採用適當數量參數的方法。因此,鑑於JVM體系結構,非元組函數更有效。

3

考慮這個例子:

scala> def mult = (x: Int, y: Int) => x * y 
mult: (Int, Int) => Int 

scala> val list = List(1, 2, 3) 
list: List[Int] = List(1, 2, 3) 

scala> list zip list map mult 
<console>:10: error: type mismatch; 
found : (Int, Int) => Int 
required: ((Int, Int)) => ? 
       list zip list map mult 
           ^

scala> list zip list map mult.tupled 
res4: List[Int] = List(1, 4, 9) 

有你在哪裏結束配對的元組元素很多情況下。在這種情況下,你需要一個元組函數來處理它。但是還有很多其他的地方,那就是不是是真的!例如:

scala> list.foldLeft(1)(mult) 
res5: Int = 6 

scala> list.foldLeft(1)(mult.tupled) 
<console>:10: error: type mismatch; 
found : ((Int, Int)) => Int 
required: (Int, Int) => Int 
       list.foldLeft(1)(mult.tupled) 
            ^

所以,基本上,Scala有元組和參數之間的對立,這意味着你必須轉換從tupled到untupled反之亦然這裏和那裏的功能。