在 Scala中的函数编程第4章中,我们为map
类型的getOrElse
,flatMap
和Option
提供了以下定义:
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
正在做的事情,但我不了解map(f)
定义中的flatMap
调用是如何工作的。 f
A => Option[B]
中的flatMap
类型为map
,但我们似乎可以调用A => B
f
,其中getOrElse None
类型的函数带map(f)
1}}。电话flatMap
显然是关键,但我不明白它如何让我们在{{1}}中拨打{{1}}。
答案 0 :(得分:4)
当您致电flatMap
并传递功能A => Option[B]
时,flatMap
会调用map
并传递相同的功能但 {{1 } B
中{}}与flatMap
中的B
不同。例如,如果你传递了一些
map
然后,对于Int => Option[String]
,map
,将返回B = Option[String]
。
因此,Option[Option[String]]
中的getOrElse
可以获取内部flatMap
或返回Option[B]
。
答案 1 :(得分:2)
B
只是变量类型参数的名称。它只在其范围内有意义。换句话说,B
中的map
和flatMap
定义不必相同,它们是完全不同的参数。
本来可以写得完全相同:
def flatMap[C](f: A => Option[C]): Option[C] =
map(f) getOrElse None
现在,在这个术语中,很容易看出,此处使用的map
有Option[C]
作为其类型参数的值。