Scala:正常函数与tupled函数?

时间:2011-11-29 07:59:22

标签: function generics scala types tuples

这些有什么区别?我知道他们的类型签名是不同的,并且所有函数都从正常开始,并且必须.tupled才能获得它们的元组形式。使用un-tupled(但非curried)函数有什么好处?特别是因为在我看来,将多个参数传递给一个tupled函数无论如何都会自动解包它们,所以所有的外观都是相同的。

我看到的一个区别是它强制你为每个函数参数提供类型:Function0Function1Function2Function3等,而tupled函数都只是Function1[A, R],但这似乎是一个缺点。使用非拼写函数的最大优势是什么?它们是默认函数?

2 个答案:

答案 0 :(得分:7)

Tupled函数要求在调用它们时创建元组对象(除非参数恰好已经打包到元组中)。非tupled函数只是定义一个采用适当数量参数的方法。因此,给定JVM体系结构,非拼写函数更有效。

答案 1 :(得分: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)

在许多情况下,您最终会在元组中配对元素。在这种情况下,您需要一个tupled函数来处理它。但是还有许多其他地方是真的!例如:

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,反之亦然。