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

4

2
毫无意义,是错误的,我不知道为什么那个东西还在那里。 - Ende Neu
“Still”是指这是一个已知/已报告的问题吗? - Jörg W Mittag
实际上,我认为我的问题重复了这个 https://dev59.com/3YPba4cB1Zd3GeqPyN-_ - stackoverflower
我认为这个问题过去曾经出现过(我指的是几年前),我记得在某个地方看到了一张票据,说明scaladoc在大部分部分都是错误的,你可以看看这个链接:this - Ende Neu
你关于重复的说法是正确的。 - Jörg W Mittag
1个回答

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)]

这不是方法签名,而是 "用例签名"。 这是一个简化的签名,表示该方法的最常见用法。 真正的签名是:

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类型构造器应用于两个参数AB

请注意,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


那么你得到了什么?它应该只是 Map[A,B] 吗? - Stephen
请看更新。某种意义上,是的,您会得到Map[A, B],但Athis映射的原始键值对,即type A = (K, V),因此您将得到Map[(K, V), B]作为结果。 - Jörg W Mittag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接