Я действительно не понимаю понимания Map и FlatMap. То, что я не понимаю, заключается в том, как для понимания понимается последовательность вложенных вызовов map и flatMap. Следующий пример: Функциональное программирование в Scala
def bothMatch(pat:String,pat2:String,s:String):Option[Boolean] = for {
f <- mkMatcher(pat)
g <- mkMatcher(pat2)
} yield f(s) && g(s)
переводится на
def bothMatch(pat:String,pat2:String,s:String):Option[Boolean] =
mkMatcher(pat) flatMap (f =>
mkMatcher(pat2) map (g => f(s) && g(s)))
Метод mkMatcher определяется следующим образом:
def mkMatcher(pat:String):Option[String => Boolean] =
pattern(pat) map (p => (s:String) => p.matcher(s).matches)
И метод шаблона выглядит следующим образом:
import java.util.regex._
def pattern(s:String):Option[Pattern] =
try {
Some(Pattern.compile(s))
}catch{
case e: PatternSyntaxException => None
}
Будет здорово, если кто-то может пролить свет на обоснование использования карты и flatMap здесь.