Confuso com a compreensão da transformação flatMap / Map

Eu realmente não pareço estar entendendo Map e FlatMap. O que não consigo entender é como uma compreensão para é uma sequência de chamadas aninhadas para map e flatMap. O exemplo a seguir é de Functional Programming in Scala def bothMatch(pat:String,pat2:String,s:String):Option[Boolean] = for...