Cal*_*Cal 3 monads functional-programming scala flatmap
例如,
Vector(Some(1), Some(2), Some(3), None).flatMap{
n => n
}
Run Code Online (Sandbox Code Playgroud)
产生一个Vector(1, 2, 3)而不是给出一个错误.正如我在其他语言中看到的那样,flatMap当你有一个生成嵌套的mapper函数时使用,所以我希望这是一个有效的flatMap:
Vector(1, 2, 3).flatMap{
eachNum => Vector(eachNum)
}
Run Code Online (Sandbox Code Playgroud)
我的mapper函数产生一个Vector会导致嵌套(即Vector(Vector(1), Vector(2), Vector(3), Vector(4))),如果我使用了一个map由于容器包装.但是,flatMap将删除此嵌套并将其展平.当有两个相同的monad嵌套时,这是有意义的.
但是,我不明白如何使用一个flatMapmapper函数返回一个Optionmake 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))
Run Code Online (Sandbox Code Playgroud)
这告诉我们它正在使用option2Iterable转换来转换Option为Iterable,并且Iterable是GenTraversableOnceflatMap期望的类型的子类型.