Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:zipped产生了什么?为什么它可以映射为一对?_Scala - Fatal编程技术网

Scala:zipped产生了什么?为什么它可以映射为一对?

Scala:zipped产生了什么?为什么它可以映射为一对?,scala,Scala,在一篇关于的文章中,@Martin Odersky建议使用 foo zipWith(_ + _) bar (其中,foo和bar是Seq)以下内容更好(并且在Scala中实际工作) 我的问题是map如何知道它的参数(表面上看起来似乎是一对)应该被分成两个元素 以下内容实际上在工作表中运行 val list1 = List(1, 2, 3, 4) //> list1 : List[Int] = List(1, 2, 3, 4) val list2

在一篇关于的文章中,@Martin Odersky建议使用

 foo zipWith(_ + _) bar
(其中,
foo
bar
Seq
)以下内容更好(并且在Scala中实际工作)

我的问题是
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类型,它可以为
映射
函数提供两个参数?而且
压缩
是创建它的实例的唯一方法吗?

它是。您可以像下面这样手动创建实例:

val zipped = new Tuple2Zipped(Seq(1, 2), Seq(3, 4))
这是你的电话号码

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


Tuple2Zipped
不是任何scala集合类型的后代,因此其
map
方法与常规scala集合的
map
方法没有任何区别。

谢谢您的回答。这是一种特殊情况,它的
map
将不同于所有其他
map
。我很惊讶,这并没有得到更多的宣传。这是一个相当大的发现,从来没有想过会有像这样的收藏,但却与众不同。还有
Tuple3Zipped
,它允许更有趣的构造
(a,b,c)。遗憾的是,3之后没有继续。虽然您不能为
.zip
序列编写
映射(+.)
,但您仍然可以使用大小写匹配来获得单个元素:
list3map{case(a,b)=>a+b}
。没有那么短,但它很重要。
val zipped = new Tuple2Zipped(Seq(1, 2), Seq(3, 4))
def map[B](f: (El1, El2) => B): Seq[B]