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

Тип возврата Scala для/yield

Я читаю Scala для нетерпимого, и я наткнулся на то, что заставило меня почесывать голову.

Следующее возвращает строку:

scala> for ( c<-"Hello"; i <- 0 to 1) yield (c+i).toChar
res68: String = HIeflmlmop

Но это возвращает вектор:

scala> for (i <- 0 to 1; c <- "Hello") yield (c + i).toChar
res72: scala.collection.immutable.IndexedSeq[Char] = Vector(H, e, l, l, o, I, f, m, m, p)

Текст, предшествующий этим двум примерам, читается...

"Когда тело цикла for начинается с выхода, тогда цикл создает набор значений, по одному для каждой итерации... Этот тип цикла называется понятием. Сгенерированная коллекция совместима с первым генератором.

Если сгенерированная коллекция совместима с первым генератором, то почему не второй пример возвращает тип Range, как в следующем:

scala> val range = 0 to 1
range: scala.collection.immutable.Range.Inclusive = Range(0, 1)

Или я неверно истолковываю то, что означает текст, "... сгенерированная коллекция совместима с первым генератором".

4b9b3361

Ответ 1

для-понимания понимаются в серии операций map, flatMap и filter.

Когда вы используете map на Range, вы получаете вывод Vector:

scala> 0 to 2 map (x => x * x)
res12: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 4)

Это связано с тем, что Range представляет собой очень простой вид коллекции, по существу, просто two три числа: начальное значение, конечное значение и шаг. Если вы посмотрите на результат вышеприведенного сопоставления, вы увидите, что результирующие значения не могут быть представлены чем-то типа Range.

Ответ 2

в этом понимании for (i <- 0 to 1; c <- "Hello") yield (c + i).toChar 1-й генератор имеет тип scala.collection.immutable.Range.Inclusive вектор результата урока имеет тип scala.collection.immutable.IndexedSeq [Int] и если вы проверите класс Диапазон: http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Range

показывает Диапазон расширяет/смешивает IndexedSeq. супер тип IndexedSeq совместим с подтипом Диапазон.

Если результат не может быть представлен диапазоном (как объяснил предыдущий ответ), он будет "искать" супер тип для представления результата.

введите описание изображения здесь