2017-05-26 83 views
4

我读斯卡拉地图文档,并得到了由这种方法签名scala - 什么地图[(A,B)]是什么意思?

def zipAll[B](that: collection.Iterable[B], thisElem: A, thatElem: B): Map[(A, B)] 

困惑是什么Map[(A, B)]意思?是否与Map[A, B]相同?由于

链接到文档:

http://www.scala-lang.org/api/current/scala/collection/immutable/Map.html

+2

没有任何意义,这是错误的,我不知道为什么那件事仍然存在。 –

+0

“仍然”你的意思是这是一个已知的/已经报告的问题? –

+0

其实,我认为我的问题重复了这个https://stackoverflow.com/q/26132459/842860 – stackoverflower

回答

3

I'm reading the Scala Map doc, and got confused by this method signature

def zipAll[B](that: collection.Iterable[B], thisElem: A, thatElem: B): Map[(A, B)] 

这是方法签名。这是“use case signature”。它是一个简化的签名,表示该方法最常用的用法。所述真正签名是:

def zipAll[B, A1 >: (K, V), That](that: GenIterable[B], thisElem: A1, thatElem: B)(implicit bf: CanBuildFrom[Map[K, V], (A1, B), That]): That 

What does Map[(A, B)] mean?

(A, B)Tuple2[A, B]语法糖,即一对(又名2-元组)类型。

Is it the same as Map[A, B] ?

没有,Map[Tuple2[A, B]]是不一样的Map[A, B]:前者适用的Map类型构造一个参数(A, B)而后者适用的Map类型的构造函数来参数,AB

请注意,Map类型构造函数有两个参数,所以前者只是一个错误:您不能将Map类型构造函数仅应用于一个参数,您需要两个参数。

请记住,你看到的签名是唯一一个用例,它是由人类书面人类阅读,它是不是类型检查验证。因此,它可以包含错误。

还要注意,整个集合层次结构中有很多重复类型签名和用例,这些由另外的脚本生成。看起来其中一个脚本只是产生了Map.zipAll的错误签名(请注意,Map上的其他zip变体中也存在相同的错误)。

一个小实验显示zip将映射的键值对作为结果对的第一个元素和来自that集合的元素作为结果对的第二个元素,并从中构建映射,这会导致地图里面有原键值对的键和other元素值:

Map("one" → 1, "two" → 2) zip Seq('a, 'b, 'c) 
//=> Map((one, 1) -> 'a, (two, 2) -> 'b) 

因此,简化使用情况的签名应该是这样的:

def zipAll[A](that: collection.Iterable[A], thisElem: (K, V), thatElem: A): Map[(K, V), A] 

它看起来像脚本感到困惑,并且在签名中用(K, V)代替A

+0

那么你会得到什么?它应该是“Map [A​​,B]”吗? – Stephen

+0

查看更新。从某种意义上说,是的,你得到了'Map [A​​,B]',但'A's是'this'映射的原始键值对,即'type A =(K,V)',所以你会得到'Map [(K,V),B]'结果。 –