gpt4 book ai didi

scala - 在 Scala 2 中,使用 .toSet 生成的 Set 类型推断失败?

转载 作者:行者123 更新时间:2023-12-02 06:47:55 25 4
gpt4 key购买 nike

为什么类型推断在这里失败?

scala> val xs = List(1, 2, 3, 3)
xs: List[Int] = List(1, 2, 3, 3)

scala> xs.toSet map(_*2)
<console>:9: error: missing parameter type for expanded function ((x$1) => x$1.$times(2))
xs.toSet map(_*2)

但是,如果分配了xs.toSet,它就会编译。

scala> xs.toSet
res42: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> res42 map (_*2)
res43: scala.collection.immutable.Set[Int] = Set(2, 4, 6)

另外,反之亦然,从 List 转换为 Set,并且映射到 List 也符合要求。

scala> Set(5, 6, 7)
res44: scala.collection.immutable.Set[Int] = Set(5, 6, 7)

scala> res44.toList map(_*2)
res45: List[Int] = List(10, 12, 14)

最佳答案

问:为什么 toSet 没有执行我想要的操作?

答:那太容易了。

问:但是为什么不能编译呢? List(1).toSet.map(x => ...)

答:Scala 编译器无法推断 xInt

问:什么,这很蠢吗?

A:嗯,List[A].toSet 不会返回 immutable.Set[A]。它为某些未知的 B >: A 返回一个 immutable.Set[B]

问:我怎么知道这一点?

A:来自 Scaladoc。

问:但是为什么toSet要这样定义呢?

答:您可能会假设 immutable.Set 是协变的,但事实并非如此。它是不变的。而toSet的返回类型处于协变位置,因此不能允许返回类型不变。

问:“协变位置”是什么意思?

答:让我为您提供维基百科:http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science) 。另请参阅 Odersky、Venners 和 Spoon 的第 19 章。

问:我现在明白了。但为什么 immutable.Set 是不变的呢?

答:让我为您 Stack Overflow:Why is Scala's immutable Set not covariant in its type?

问:我投降。如何修复我的原始代码?

答:这有效:List(1).toSet[Int].map(x => ...)。也是如此: List(1).toSet.map((x: Int) => ...)

(向 Friedman 和 Felleisen 致歉。感谢 Paulp 和 ijuma 的帮助)

编辑:Adriaan's answer中有有值(value)的附加信息。以及那里和这里评论中的讨论。

关于scala - 在 Scala 2 中,使用 .toSet 生成的 Set 类型推断失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32784483/

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