Тип набора, сгенерированный для с урожаем

Когда я оцениваю 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.

22
задан Eugene Yokota 15 December 2010 в 21:04
поделиться

1 ответ

Спасибо 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, ...
19
ответ дан 29 November 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: