val a = Array(2,3,5) a: Array[Int] = Array(2, 3, 5) scal-6ren">
gpt4 book ai didi

scala "yield"不会产生正确的类型

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

yield主要用于 for-yield 循环以生成新的同类型集合。例如:

scala> val a = Array(2,3,5)
a: Array[Int] = Array(2, 3, 5)

scala> val result = for (elem <- a) yield 2 * elem
result: Array[Int] = Array(4, 6, 10)

这一切正常,for 循环接受一个数组并返回一个数组。

但后来我注意到了这一点:
scala> 1 to 10
res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

这会生成一个范围类型集合,但是当您将它与 for-yield 循环结合使用时,会发生这种情况:
scala> for (i <- (1 to 10)) yield i + 2
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

传入的类型是range,但它发出的类型是Vector。为什么会发生这种情况?我错过了什么吗?

最佳答案

看看Range :

class Range extends AbstractSeq[Int] with IndexedSeq[Int] with CustomParallelizable[Int, ParRange] with Serializable

然后签名 map :
 def map[B](f: (A) ⇒ B): IndexedSeq[B]

这样做的原因是 Range实际上是加糖的 IndexedSeq ,它在顶部添加的只是范围特定的行为:
Range.Inclusive , Range.Exclusive等等。

原因 map返回 IndexedSeq可能是编译器限制,因为它无法预测 Range 的类型来自 map 的结果手术。

关于scala "yield"不会产生正确的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20818016/

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