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)]
这不是方法签名,而是 "用例签名"。 这是一个简化的签名,表示该方法的最常见用法。 真正的签名是:
def zipAll[B, A1 >: (K, V), That](that: GenIterable[B], thisElem: A1, thatElem: B)(implicit bf: CanBuildFrom[Map[K, V], (A1, B), That]): That
Map[(A, B)]
是什么意思?
(A, B)
是Tuple2[A, B]
的语法糖,即一个二元组类型。
它和Map[A, B]
一样吗?
不是,Map[Tuple2[A, B]]
和Map[A, B]
不同:前者将Map
类型构造器应用于一个单一参数(A, B)
,而后者将Map
类型构造器应用于两个参数A
和B
。
请注意,Map
类型构造器有两个参数,因此前者只是一个错误:您不能将Map
类型构造器仅应用于单个参数,需要两个参数。
请记住,您看到的签名只是一个用例,它是由人类编写的,供人类阅读,它没有被类型检查器验证。因此,它可能包含错误。
还要注意,整个集合层次结构中存在许多重复的类型签名和用例,这些都是由额外的脚本生成的。看起来其中一个脚本只是为Map.zipAll
生成了错误的签名(请注意,其他zip
变体在Map
上也存在相同的错误)。
一个小实验表明,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
。