Scala:压缩产品是什么,为什么它可以映射为一对?

Rus*_*ott 3 scala

较早前的问题有关zipWith,@马丁Odersky的建议的,与其类似

 foo zipWith(_ + _) bar
Run Code Online (Sandbox Code Playgroud)

(foo以及bar哪些Seq是)以下更好(实际上在Scala中有效).

(foo, bar).zipped map (_ + _)
Run Code Online (Sandbox Code Playgroud)

我的问题是如何map知道它的论证(表面看起来似乎是一对)应该分成两个元素?

以下实际上在工作表中运行.

val list1 = List(1, 2, 3, 4)                    //> list1  : List[Int] = List(1, 2, 3, 4)
val list2 = List(5, 6, 7, 8)                    //> list2  : List[Int] = List(5, 6, 7, 8)
val zippedResult = (list1, list2).zipped        //> list3  : scala.runtime.Tuple2Zipped[Int,List[Int],Int,List[Int]] = scala.run
                                              //| time.Tuple2Zipped@f4bf78da
zippedResult.mkString(", ")                     //> res4: String = (1,5), (2,6), (3,7), (4,8)
zippedResult map (_ + _)                        //> res5: List[Int] = List(6, 8, 10, 12)
Run Code Online (Sandbox Code Playgroud)

我看到zippedResult其实有4个类型参数,而不仅仅是对列表.

val list3 = List((1, 5), (2, 6), (3, 7), (4, 8))
                                              //> list3a  : List[(Int, Int)] = List((1,5), (2,6), (3,7), (4,8))
list3 == zippedResult                           //> res6: Boolean = false
Run Code Online (Sandbox Code Playgroud)

我写不出来

list3 map(_ +_ )
Run Code Online (Sandbox Code Playgroud)

那么Tuple2Zipped它可以为map函数提供两个参数的类型是什么?并且是zipped创建它的唯一方法吗?

sen*_*nia 5

是的runtime.Tuple2Zipped.您可以像这样手动创建实例:

val zipped = new Tuple2Zipped(Seq(1, 2), Seq(3, 4))
Run Code Online (Sandbox Code Playgroud)

这是方法来源map.

方法map声明如下(简化):

def map[B](f: (El1, El2) => B): Seq[B]
Run Code Online (Sandbox Code Playgroud)

Tuple2Zipped不是任何scala集合类型的后代,因此它的map方法与map常规scala集合的方法没有任何关系.