例如,
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类型的子类型.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。