Спасибо michael.kebe за ваш комментарий.
Это объясняет, как for
переводится в операции с map
, flatMap
, filter
и foreach
. Итак, мой пример:
val s = for (i <- 0 to 9) yield math.random + i
переводится примерно так (я не уверен, что в данном случае это map
или flatMap
):
val s = (0 to 9) map { math.random + _ }
Тип результата операций, таких как map
для коллекций, зависит от коллекции, для которой вы ее вызываете. Тип 0 to 9
является Range.Inclusive
:
scala> val d = 0 to 9
d: scala.collection.immutable.Range.Inclusive with scala.collection.immutable.Range.ByOne = Range(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
Результатом операции map
на этом является IndexedSeq
(из-за содержимого компоновщика внутри библиотеки коллекций).
Итак, чтобы ответить на мой вопрос: результат for (...) yield ...
зависит от того, какой тип находится внутри парантезов. Если я хочу получить List
в результате, я мог бы сделать это:
scala> val s = for (i <- List.range(0, 9)) yield math.random + i
s: List[Double] = List(0.05778968639862214, 1.6758775042995566, ...