Scala 中的 flatMap 实现



Scala的函数式编程第4章中,我们为Option类型的mapgetOrElseflatMap提供了以下定义:

def map[B](f: A => B): Option[B] = this match {
  case Some(x) => Some(f(x))
  case _ => None
}
def getOrElse[B>:A](default: => B): B = this match {
  case Some(x) => x
  case _ => default
}
def flatMap[B](f: A => Option[B]): Option[B] = 
  map(f) getOrElse None

我明白flatMap在做什么,但我不明白flatMap定义中的调用map(f)是如何工作的。 fflatMapA => Option[B]作为其类型,但我们似乎能够调用map,它期望一个类型为A => B的函数,并带有f。呼叫getOrElse None显然是关键,但我不明白它如何允许我们在flatMap中呼叫map(f).

当你调用flatMap并将函数传递A => Option[B]时,flatMap调用map并传递相同的函数,flatMap中的Bmap中的B不同。例如,如果您通过一些

Int => Option[String]

然后对于mapB = Option[String]并将返回Option[Option[String]]

因此,flatMap获取遗嘱的getOrElse要么检索内部Option[B],要么返回None

B只是变量类型参数的名称。它只在其范围内有意义。换句话说,mapflatMap定义中的B不必相同,它们是完全不同的参数。

可以绝对等价地写:

def flatMap[C](f: A => Option[C]): Option[C] = 
  map(f) getOrElse None

现在,在这个术语中,很容易看出,此处使用的map Option[C]为其类型参数的值。