Подтвердить что ты не робот

Тип коллекции, сгенерированный для с доходностью

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

Всегда ли for с yield возвращает IndexedSeq или может также возвращать некоторый класс класса другого типа (например, LinearSeq)? Если он может также вернуть что-то еще, то что определяет тип возврата и как я могу влиять на него?

Я использую Scala 2.8.0.RC3.

4b9b3361

Ответ 1

Спасибо 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, ...

Ответ 2

Вы всегда можете преобразовать диапазон в список, используя toList:

> val s = for (i <- (0 to 9).toList) yield math.random + i
> s  : List[Double]