Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 调用toSet时缺少参数类型错误?_Scala_Type Inference - Fatal编程技术网

Scala 调用toSet时缺少参数类型错误?

Scala 调用toSet时缺少参数类型错误?,scala,type-inference,Scala,Type Inference,试图从字符列表中生成映射到其频率的唯一字符列表,例如: 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)) 但是

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

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为什么会抱怨这种语法吗?

将类型[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))

当你说
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))

仅供参考,您可以使用
myList.groupBy(identity).mapValues(u.size)
来完成您发布的第一件事。谢谢,尽管这会将问题推到“为什么”,因为我在第一个示例中没有提供该类型的信息。有关“为什么”部分,请参阅Rex的答案。