加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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的类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读