scala“yield”不会产生正确的类型
发布时间:2020-12-16 18:41:10 所属栏目:安全 来源:网络整理
导读:yield主要用于for-yield循环以生成新的相同类型的集合.例如: scala val a = Array(2,3,5)a: Array[Int] = Array(2,5)scala val result = for (elem - a) yield 2 * elemresult: Array[Int] = Array(4,6,10) 这一切都很好,for循环接受一个数组并返回一个数组
yield主要用于for-yield循环以生成新的相同类型的集合.例如:
scala> val a = Array(2,3,5) a: Array[Int] = Array(2,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,4,5,7,8,9,10) 这会生成范围类型集合,但是当您将此与for-yield循环结合使用时,会发生以下情况: scala> for (i <- (1 to 10)) yield i + 2 res2: scala.collection.immutable.IndexedSeq[Int] = Vector(3,10,11,12) 进来的类型是范围,但它发出的类型是Vector.为什么会这样?我错过了什么吗? 解决方法
看看范围:
class Range extends AbstractSeq[Int] with IndexedSeq[Int] with CustomParallelizable[Int,ParRange] with Serializable 然后是地图的签名: def map[B](f: (A) ? B): IndexedSeq[B] 这样做的原因是Range实际上是一个含糖的IndexedSeq,它在顶部添加的是范围特定的行为: Range.Inclusive,Range.Exclusive等. map返回IndexedSeq的原因可能是编译器限制,因为它无法预测由map操作产生的Range的类型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |