scala - Map[(A, B)] 是什么意思?

scala - What Map[(A, B)] mean?

我正在阅读 Scala Map 文档,对这个方法签名感到困惑

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

Map[(A, B)]是什么意思?和Map[A, B]一样吗?谢谢

Link 到文档:

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

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”。它是一个 simplified 签名,指示该方法的最常见用法。 真正的签名是:

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] 的语法糖,即一对(又名二元组)类型。

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

不,Map[Tuple2[A, B]]Map[A, B] 不同:前者将 Map 类型构造函数应用于 单个 参数 (A, B) 而后者将 Map 类型构造函数应用于 两个 参数,AB.

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

记住你看到的签名只是一个用例,它是由一个human写给human阅读的,它是类型检查器未验证。因此,它可能包含错误。

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

一个小实验表明,zip 将 map 的键值对作为结果对的第一个元素,将 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