2011-11-29 20 views
6

これらの違いは何ですか?私は彼らのタイプシグネチャが異なっていることを知っています、そして、すべての機能は正常に始まり、それらのタップルフォームを得るためには.tupledでなければなりません。非タップル(しかし非カルト)関数を使用する利点は何ですか?特に、複数の引数をタプルされた関数に渡すと、自動的にそれらをアンパックするので、すべての外観によって同じであるように思えるからです。 tupledの機能はすべてちょうどFunction1[A, R]をしているのに対し、Function0Function1Function2Function3など、それは欠点のように思える:私は見スカラ:通常の関数対タプル関数?

1つの違いは、関数の引数のすべての数の種類を持っているあなたを強制していることです。既定の非タップル関数を使用する大きな利点は何ですか?

答えて

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はあなたがその逆あちこちuntupledにtupledから機能を変換しなければならないことを意味タプルとパラメータの間の二分法を、持っています。

関連する問題