在Scala的函数式编程第4章中,我们为Option
类型的map
、getOrElse
和flatMap
提供了以下定义:
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)
是如何工作的。 f
在flatMap
中A => Option[B]
作为其类型,但我们似乎能够调用map
,它期望一个类型为A => B
的函数,并带有f
。呼叫getOrElse None
显然是关键,但我不明白它如何允许我们在flatMap
中呼叫map(f)
.
当你调用flatMap
并将函数传递A => Option[B]
时,flatMap
调用map
并传递相同的函数,但flatMap
中的B
与map
中的B
不同。例如,如果您通过一些
Int => Option[String]
然后对于map
,B = Option[String]
并将返回Option[Option[String]]
。
因此,flatMap
获取遗嘱的getOrElse
要么检索内部Option[B]
,要么返回None
。
B
只是变量类型参数的名称。它只在其范围内有意义。换句话说,map
和flatMap
定义中的B
不必相同,它们是完全不同的参数。
可以绝对等价地写:
def flatMap[C](f: A => Option[C]): Option[C] =
map(f) getOrElse None
现在,在这个术语中,很容易看出,此处使用的map
Option[C]
为其类型参数的值。