尝试从字符列表中生成映射到其频率的唯一字符列表-例如就像是:

List('a','b','a') -> List(('a',2), ('b',1))


因此,只需在控制台中进行修改,即可:

val l = List('a', 'b', 'c', 'b', 'c', 'a')
val s = l.toSet
s.map(i => (i, l.filter(x => x == i).size))


但是,仅通过合并最后两行来缩短不是吗?

l.toSet.map(i => (i, l.filter(x => x == i).size))


给出错误“缺少参数类型”。

有人可以解释为什么Scala抱怨这种语法吗?

最佳答案

当您说val s = l.toSet时,编译器会认为toSet的唯一明智类型是Char-这是最具体的选择。然后,假设sChar的集合,则编译器意识到该映射必须来自Char

但是在第二种情况下,它不对toSet中元素的类型进行判断。它可能是Char,但是AnyVal也可以工作,就像Any一样。

l.toSet.map((i: Any) => (i, l.filter(x => x == i).size))


通常,规则是编译器应选择最具体的值。但是由于函数的参数是互变的,因此当它们以Any作为参数时它们是最特定的,因此编译器无法确定。可能存在打破平局的规则(“更喜欢早期假设”),但是没有一个实现的规则。因此它要求您的帮助。

您可以在函数参数或toSet上提供类型以解决此问题:

l.toSet.map((i: Char) => (i, l.filter(x => x == i).size))
l.toSet[Char].map(i => (i, l.filter(x => x == i).size))

关于scala - 通过调用toSet缺少参数类型错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13130013/

10-12 00:42