Function Scala:普通函数还是元组函数?

Function Scala:普通函数还是元组函数?,function,generics,scala,types,tuples,Function,Generics,Scala,Types,Tuples,这两者有什么区别?我知道它们的类型签名是不同的,所有函数都是从正常开始的,必须是.tuple才能得到它们的tuple形式。使用非元组(但非curried)函数有什么好处?特别是因为在我看来,将多个参数传递给一个元组函数会自动解压它们,所以看起来它们是一样的 我看到的一个区别是,它强制您为每一个函数参数都有类型:Function0、Function1、Function2、Function3等等,而元组函数都只是Function1[A,R],但这似乎是一个缺点。使用默认的非元组函数的最大优点是什么?

这两者有什么区别?我知道它们的类型签名是不同的,所有函数都是从正常开始的,必须是
.tuple
才能得到它们的tuple形式。使用非元组(但非curried)函数有什么好处?特别是因为在我看来,将多个参数传递给一个元组函数会自动解压它们,所以看起来它们是一样的


我看到的一个区别是,它强制您为每一个函数参数都有类型:
Function0
Function1
Function2
Function3
等等,而元组函数都只是
Function1[A,R]
,但这似乎是一个缺点。使用默认的非元组函数的最大优点是什么?

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

考虑以下示例:

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>defmult=(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>列表zip列表映射mult
:10:错误:类型不匹配;
发现:(Int,Int)=>Int
必需:((Int,Int))=>?
列表zip列表映射mult
^
scala>列表zip列表映射多元组
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>list.foldLeft(1)(mult)
res5:Int=6
scala>list.foldLeft(1)(多元组)
:10:错误:类型不匹配;
找到:((Int,Int))=>Int
必需:(Int,Int)=>Int
列表折叠(1)(多元组)
^
所以,基本上,Scala在元组和参数之间有一个二分法,这意味着您必须将函数从元组转换为非耦合,反之亦然