Scala中的flatMap实现

时间:2014-12-31 03:45:56

标签: scala

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

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}}。

2 个答案:

答案 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中的mapflatMap定义不必相同,它们是完全不同的参数。

本来可以写得完全相同:

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

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