为什么我可以在 Future.traverse 的第一个参数中使用 `to` 而不是 `until`?

Tom*_*ang 8 scala scala-2.13

为什么我可以使用为 的第一个参数to构造 a ,而不是?请参阅以下示例 Scala 控制台交互。RangeFuture.traverseuntil

scala> Future.traverse(1 to 5)(Future.successful)
val res5: scala.concurrent.Future[IndexedSeq[Int]] = Future(<not completed>)

scala> Future.traverse(1 until 5)(Future.successful)
                                 ^
       error: Cannot construct a collection of type scala.collection.immutable.AbstractSeq[Int] with elements of type Int based on a collection of type scala.collection.immutable.AbstractSeq[Int].

scala> res5
val res7: scala.concurrent.Future[IndexedSeq[Int]] = Future(Success(Vector(1, 2, 3, 4, 5)))

scala>
Run Code Online (Sandbox Code Playgroud)

请注意,尽管 Scala 2.13.2 似乎具有相同的行为,但我将 Scala 2.13.5 用于控制台。

对于它的价值,我注意到toreturnRange.Inclusiveuntilreturn Range.Exclusive。但是两者都扩展了Range,所以我不知道这两种类型之间有什么不同,以至于Future.traverse可以将一个而不是另一个作为第一个参数。

Tom*_*ang 6

这看起来像是几个问题的组合。

1 until 5返回 a scala.collection.immutable.Range,而1 to 5返回Range.Inclusive

scala> val exclusive: Range.Exclusive = 1 until 5
                                          ^
       error: type mismatch;
        found   : scala.collection.immutable.Range
        required: Range.Exclusive

scala> val inclusive: Range.Inclusive = 1 to 5
val inclusive: Range.Inclusive = Range 1 to 5
Run Code Online (Sandbox Code Playgroud)

Range.Inclusive是一个具体的类,并且scala.collection.immutable.Range是双方的父母Range.InclusiveRange.Exclusive。看起来好像是由于Leo C 提到的开放错误scala.collection.immutable.Range只考虑AbstractSeq而不是IndexedSeq(正如 Silvio Mayolo 的评论所建议的那样)。并且AbstractSeq无法构建。Range.Inclusive,作为一个具体的类,没有同样的问题。

我现在不确定为什么AbstractSeq不能构建。我原以为原因AbstractSeqabstract,但IndexedSeq也是一个特征。也就是说,它可能是设计AbstractSeq无法构建的,但 IndexedSeq 可以。