scala - 为什么 vector[Option[Int]] 上的 flatMap 其映射器函数结果不是 Vector[Option[Int]] 有效?

标签 scala functional-programming monads flatmap

例如,

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

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

我的映射器函数产生一个 Vector如果我使用 Vector(Vector(1), Vector(2), Vector(3), Vector(4)) 会导致嵌套(即 map )由于容器包装。然而,flatMap将删除此嵌套并将其展平。当两个相同的 monad 嵌套时,这是有道理的。

但是,我不明白如何使用 flatMap带有返回 Option 的映射器函数制作 Vector[Option[Int]]成为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 转换来转换 OptionIterable , 和 IterableGenTraversableOnce 的子类型键入 flatMap 期望的类型。

关于scala - 为什么 vector[Option[Int]] 上的 flatMap 其映射器函数结果不是 Vector[Option[Int]] 有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34735364/

相关文章:

scala - 将多个函数与回调参数组合起来

scala - 如何从任务中打印累加器变量(似乎为 "work"而没有调用 value 方法)?

scala - 如何将csv文件转换为rdd

Haskell:顺序不敏感的函数式应用程序

haskell - 为什么 Haskell 强制数据构造函数的第一个字母大写?

haskell - 使用 MonadPrompt 实现回放

scala - 处理 Scala 集合中的异常

Scala - 使用谓词函数来总结字符串列表

haskell - 在这种情况下,为什么在与嵌套的 StateT monadT 交互时不需要使用 'lift'?

haskell - 如何在 Haskell 中以隐藏的方式初始化状态(就像 PRNG 一样)?