2011-11-29 62 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反之亦然这里和那里的功能。