这些有什么区别?我知道他们的类型签名是不同的,并且所有函数都从正常开始,并且必须.tupled
才能获得它们的元组形式。使用un-tupled(但非curried)函数有什么好处?特别是因为在我看来,将多个参数传递给一个tupled函数无论如何都会自动解包它们,所以所有的外观都是相同的。
我看到的一个区别是它强制你为每个函数参数提供类型:Function0
,Function1
,Function2
,Function3
等,而tupled函数都只是Function1[A, R]
,但这似乎是一个缺点。使用非拼写函数的最大优势是什么?它们是默认函数?
答案 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,反之亦然。