Collection type generated by for with yield

前端 未结 2 1162
终归单人心
终归单人心 2020-12-31 01:05

When I evaluate a for in Scala, I get an immutable IndexedSeq (a collection with array-like performance characteristics, such as efficient random a

相关标签:
2条回答
  • 2020-12-31 01:40

    Thanks michael.kebe for your comment.

    This explains how for is translated to operations with map, flatMap, filter and foreach. So my example:

    val s = for (i <- 0 to 9) yield math.random + i
    

    is translated to something like this (I'm not sure if it's translated to map or flatMap in this case):

    val s = (0 to 9) map { math.random + _ }
    

    The result type of operations like map on collections depends on the collection you call it on. The type of 0 to 9 is a 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)
    

    The result of the map operation on that is an IndexedSeq (because of the builder stuff inside the collections library).

    So, to answer my question: the result of a for (...) yield ... depends on what type is inside the parantheses. If I want a List as the result, I could do this:

    scala> val s = for (i <- List.range(0, 9)) yield math.random + i
    s: List[Double] = List(0.05778968639862214, 1.6758775042995566, ...
    
    0 讨论(0)
  • 2020-12-31 01:51

    You can always transform a range to a list using toList:

    > val s = for (i <- (0 to 9).toList) yield math.random + i
    > s  : List[Double]
    
    0 讨论(0)
提交回复
热议问题