【发布时间】:2014-02-13 05:29:35
【问题描述】:
在关于zipWith 的earlier question 中,@Martin Odersky 建议不要像
foo zipWith(_ + _) bar
(其中 foo 和 bar 是 Seq's)以下更好(并且实际上在 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 是创建它实例的唯一方法吗?
【问题讨论】:
-
虽然您不能为
.zipped序列编写map(_ + _),但您仍然可以使用大小写匹配来获取各个元素:list3 map { case (a,b) => a+b }。不是那么短,但它是一些东西。
标签: scala