У меня есть следующий SCALA код (от FP В Scala книге):Что происходит под обложками в этом коде 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
(т.е. a
) в aa
в этой строке кода: this flatMap(aa => b map (bb => f(aa, bb)))
в функции map2
?
Возможный дубликат [Как прочесть этот flatMap-код?] (Http://stackoverflow.com/questions/34033746/how-to-read-this-flatmap-code) –