Вот довольно хорошее объяснение:
http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2
Использование списка в качестве примера:
Подпись карты:
map [B](f : (A) => B) : List[B]
и flatMap's
flatMap [B](f : (A) => Iterable[B]) : List[B]
Так что flatMap принимает тип [A] и возвращает повторяемый тип [B], а map принимает тип [A] и возвращает тип [B]
Это также даст вам представление о том, что flatmap «сгладит» списки.
val l = List(List(1,2,3), List(2,3,4))
println(l.map(_.toString)) // changes type from list to string
// prints List(List(1, 2, 3), List(2, 3, 4))
println(l.flatMap(x => x)) // "changes" type list to iterable
// prints List(1, 2, 3, 2, 3, 4)