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

scala – 为什么vectorMap函数结果不是Vector [Option [Int]]的V

发布时间:2020-12-16 10:06:53 所属栏目:安全 来源:网络整理
导读:例如, Vector(Some(1),Some(2),Some(3),None).flatMap{ n = n} 生成一个Vector(1,2,3)而不是给出错误.正如我在其他语言中看到的那样,当你有一个生成嵌套的mapper函数时会使用flatMap,所以我希望这是一个有效的flatMap: Vector(1,3).flatMap{ eachNum = Vect
例如,

Vector(Some(1),Some(2),Some(3),None).flatMap{
  n => n
}

生成一个Vector(1,2,3)而不是给出错误.正如我在其他语言中看到的那样,当你有一个生成嵌套的mapper函数时会使用flatMap,所以我希望这是一个有效的flatMap:

Vector(1,3).flatMap{
  eachNum => Vector(eachNum)
}

我的mapper函数会产生一个Vector,它会导致嵌套(即Vector(Vector(1),Vector(2),Vector(3),Vector(4))),如果我因为容器包装而使用了map.但是,flatMap将删除此嵌套并将其展平.当有两个相同的monad嵌套时,这是有意义的.

但是,我不明白如何使用带有mapper函数的flatMap返回一个Option,使Vector [Option [Int]]成为Vector [Int].是否存在某种转变(我以前从未见过这种转变),有人可以解释并且可能指向我一些资源吗?

非常感谢你

解决方法

我们可以使用reify来查看发生了什么:

scala> import reflect.runtime.universe._
import reflect.runtime.universe._

scala> val v = Vector(Some(1),None)
v: scala.collection.immutable.Vector[Option[Int]] = Vector(Some(1),None)

scala> reify { v.flatMap(x => x) }
res0: reflect.runtime.universe.Expr[scala.collection.immutable.Vector[Int]] =
    Expr[scala.collection.immutable.Vector[Int]]($read.v.flatMap(((x) =>
     Option.option2Iterable(x)))(Vector.canBuildFrom))

这向我们展示了它使用option2Iterable转换将Option转换为Iterable,而Iterable是flatMap期望的GenTraversableOnce类型的子类型.

(编辑:李大同)

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

    推荐文章
      热点阅读