例如,
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嵌套时,这是有意义的.
但是,我不明白如何使用一个flatMap
mapper函数返回一个Option
make Vector[Option[Int]]
成为a Vector[Int]
.是否存在某种转变(我以前从未见过这种转变),有人可以解释并且可能指向我一些资源吗?
非常感谢你
我们可以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转换来转换Option
为Iterable
,并且Iterable
是GenTraversableOnce
flatMap期望的类型的子类型.