Когда я оцениваю a for
в Scala я получаю неизменное IndexedSeq
(набор с подобными массиву рабочими характеристиками, такими как эффективный произвольный доступ):
scala> val s = for (i <- 0 to 9) yield math.random + i
s: scala.collection.immutable.IndexedSeq[Double] = Vector(0.6127056766832756, 1.7137598183155291, ...
Делает a for
с a yield
всегда возвращайтесь IndexedSeq
, или это может также возвратить некоторый другой тип класса набора (a LinearSeq
, например)? Если это может также возвратить что-то еще, то, что определяет тип возврата, и как я могу влиять на него?
Я использую Scala 2.8.0. RC3.
Спасибо michael.kebe за ваш комментарий.
Этот объясняет, как для
преобразуется в операции с 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 до 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
(из-за конструктора внутри библиотеки коллекций).
Итак, чтобы ответить на мой вопрос: результат для (...) yield ...
зависит от того, какой тип находится в скобках. Если я хочу получить в результате Список
, я могу сделать следующее:
scala> val s = for (i <- List.range(0, 9)) yield math.random + i
s: List[Double] = List(0.05778968639862214, 1.6758775042995566, ...