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

Why can I use `to` in the first argument of Future.traverse, but not `until`?

为什么我可以用toFuture.traverse的第一个参数构造一个Range,而不是until?请参阅以下示例 Scala 控制台交互。

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>

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

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

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

1 until 5returns一个scala.collection.immutable.Range,而1 to 5returnsRange.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

Range.Inclusive 是具体的 class,scala.collection.immutable.RangeRange.InclusiveRange.Exclusive 的父级。看起来好像由于提到的 open bug Leo C,scala.collection.immutable.Range 只考虑 AbstractSeq 而不是 IndexedSeq (正如 Silvio Mayolo 的评论所建议的)。而AbstractSeq是无法构造的。 Range.Inclusive,作为一个具体的 class,没有同样的问题。

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