我有以下scala代码(来自FP In Scala书):
import scala.{Option => _, Either => _, Left => _, Right => _, _} // hide std library `Option` and `Either`, since we are writing our own in this chapter
case class Left[+E](get: E) extends Either[E,Nothing]
case class Right[+A](get: A) extends Either[Nothing,A]
sealed trait Either[+E,+A] {
def map[B](f: A => B): Either[E, B] = this match {
case Right(r) => Right(f(r))
case Left(e) => Left(e)
}
def flatMap[EE >: E, B](f: A => Either[EE, B]): Either[EE, B] = this match {
case Right(r) => f(r)
case Left(e) => Left(e)
}
def map2[EE >: E, B, C](b: Either[EE, B])(f: (A, B) => C): Either[EE, C] = {
this flatMap(aa => b map (bb => f(aa, bb)))
}
}
我想知道当我这样调用map2时发生了什么:
val b = fpinscala.errorhandling.Right(2)
val a = fpinscala.errorhandling.Right("right")
val f = (a: String, b:Int) => a + b
a.map2(b)(f)
scala如何知道在此代码行中的函数中使用替代this
(ie a
)?aa
this flatMap(aa => b map (bb => f(aa, bb)))
map2
@jcm,看看这是否有意义。
a.map2(b)(f)
我们正在调用对象的map2
方法a
。在方法内部,代码a
现在称为this
。
this flatMap(aa => b map (bb => f(aa, bb)))
现在,我们正在调用对象的flatMap
方法this
(仍然是a
)。
有什么flatMap
作为论据?它需要一个函数,该函数需要一个参数(某种类型的参数,我们将其称为“ A”)并返回Either
。因此,这意味着括号之间的所有内容都是该函数。该函数没有名称(即没有def
语句),因此通常称为匿名函数。
该函数带有一个参数。这段代码aa =>
标识了自变量,以便以后可以在函数中引用它。“ aa”只是一个任意名称。我们本可以使用“ thisthat”或“ xyz”。
aa
包含的价值从何而来?它出来了this
。考虑下面的代码。
List(4,7,9).map(x => 42 - x)
在这种情况下,将map
调用匿名函数3次,一次针对List中的每个值。x
每次调用该函数时,都会采用一个新值(第一个4,然后是7,然后是9)。
如果这一切有道理,那么对b map (bb => .....)
您应用相同的逻辑,您几乎就回家了!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句