当前位置:  开发笔记 > 编程语言 > 正文

为什么VectorMap [Option [Int]]上的flatMap的mapper函数结果不是Vector [Option [Int]]有效?

如何解决《为什么VectorMap[Option[Int]]上的flatMap的mapper函数结果不是Vector[Option[Int]]有效?》经验,为你挑选了1个好方法。

例如,

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

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

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

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

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

非常感谢你



1> stew..:

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

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

scala> val v = Vector(Some(1), Some(2), Some(3), None)
v: scala.collection.immutable.Vector[Option[Int]] = Vector(Some(1), Some(2), Some(3), 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转换来转换OptionIterable,并且IterableGenTraversableOnceflatMap期望的类型的子类型.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有