在关于zipWith
的{{3}}中,@ Martin Odersky建议不要使用
foo zipWith(_ + _) bar
(其中foo
和bar
为Seq
)以下内容更好(实际上在Scala中有效)。
(foo, bar).zipped map (_ + _)
我的问题是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)
我看到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
我不能写
list3 map(_ +_ )
那么它可以为Tuple2Zipped
函数提供两个参数的map
类型是什么? zipped
是创建它实例的唯一方法吗?
答案 0 :(得分:5)
这是runtime.Tuple2Zipped
。您可以像这样手动创建实例:
val zipped = new Tuple2Zipped(Seq(1, 2), Seq(3, 4))
方法map
声明如下(简化):
def map[B](f: (El1, El2) => B): Seq[B]
Tuple2Zipped
不是任何scala集合类型的后代,因此其map
方法与常规scala集合的map
方法无关。