尝试从字符列表中生成映射到其频率的唯一字符列表-例如就像是:
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
-这是最具体的选择。然后,假设s
是Char
的集合,则编译器意识到该映射必须来自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/