gpt4 book ai didi

scala - 通过调用 toSet 缺少参数类型错误?

转载 作者:行者123 更新时间:2023-12-04 00:22:11 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com