为什么我可以在 Future.traverse 的第一个参数中使用 `to` 而不能使用 `until`?
Why can I use `to` in the first argument of Future.traverse, but not `until`?
为什么我可以用to
为Future.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.Inclusive
和 until
returns Range.Exclusive
。但是两者都扩展了 Range
,所以我不知道这两种类型之间有什么不同,以至于 Future.traverse
可以将一个而不是另一个作为第一个参数。
这看起来像是几个问题的组合。
1 until 5
returns一个scala.collection.immutable.Range
,而1 to 5
returnsRange.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.Range
是 Range.Inclusive
和 Range.Exclusive
的父级。看起来好像由于提到的 open bug Leo C,scala.collection.immutable.Range
只考虑 AbstractSeq
而不是 IndexedSeq
(正如 Silvio Mayolo 的评论所建议的)。而AbstractSeq
是无法构造的。 Range.Inclusive
,作为一个具体的 class,没有同样的问题。
目前我不确定为什么 AbstractSeq
无法构建。我以为原因是 AbstractSeq
是 abstract
,但 IndexedSeq
也是一个特征。也就是说,可能是设计使然 AbstractSeq
无法构建,但 IndexedSeq 可以。
为什么我可以用to
为Future.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.Inclusive
和 until
returns Range.Exclusive
。但是两者都扩展了 Range
,所以我不知道这两种类型之间有什么不同,以至于 Future.traverse
可以将一个而不是另一个作为第一个参数。
这看起来像是几个问题的组合。
1 until 5
returns一个scala.collection.immutable.Range
,而1 to 5
returnsRange.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.Range
是 Range.Inclusive
和 Range.Exclusive
的父级。看起来好像由于提到的 open bug Leo C,scala.collection.immutable.Range
只考虑 AbstractSeq
而不是 IndexedSeq
(正如 Silvio Mayolo 的评论所建议的)。而AbstractSeq
是无法构造的。 Range.Inclusive
,作为一个具体的 class,没有同样的问题。
目前我不确定为什么 AbstractSeq
无法构建。我以为原因是 AbstractSeq
是 abstract
,但 IndexedSeq
也是一个特征。也就是说,可能是设计使然 AbstractSeq
无法构建,但 IndexedSeq 可以。