Прослушивание лекции по коллекциям из Принципы функционального программирования в Scala, я увидел этот пример:
scala> val s = "Hello World"
scala> s.flatMap(c => ("." + c)) // prepend each element with a period
res5: String = .H.e.l.l.o. .W.o.r.l.d
Тогда мне было любопытно, почему г-н Одерский не использовал здесь map
. Но, когда я попробовал карту, у меня был другой результат, чем я ожидал.
scala> s.map(c => ("." + c))
res8: scala.collection.immutable.IndexedSeq[String] = Vector(.H, .e, .l, .l, .o,
". ", .W, .o, .r, .l,
Я ожидал, что выше вызова вернуть String, так как я map
-ing, т.е. применяя функцию к каждому элементу в "последовательности", а затем возвращаю новую "последовательность".
Однако я мог бы выполнить map
, а не flatmap
для List[String]
:
scala> val sList = s.toList
sList: List[Char] = List(H, e, l, l, o, , W, o, r, l, d)
scala> sList.map(c => "." + c)
res9: List[String] = List(.H, .e, .l, .l, .o, ". ", .W, .o, .r, .l, .d)
Почему был IndexedSeq[String]
возвращаемый тип вызова map
в строке?