繁体   English   中英

调用toSet是否缺少参数类型错误?

[英]Missing parameter type error by calling toSet?

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

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

但是,仅通过组合最后2行缩短不?

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

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

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

当你说val s = l.toSet编译器数字,唯一明智的类型toSetChar凹口-是最具体的选择。 然后,假设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))

将类型[Char]添加到toSet可以解决问题。

scala> l.toSet[Char].map(i => (i, l.filter(x => x == i).size))
scala.collection.immutable.Set[(Char, Int)] = Set((a,2), (b,2), (c,2))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM