Большая часть сложности реализации инфраструктуры сбора происходит из-за того, что Scala может - в отличие от CQ LINQ или других структур сбора - возвращать «лучший» тип коллекции для функций более высокого порядка:
val numbers = List(1,2,3,4,5)
numbers map (2*) // returns a List[Int] = List(2, 4, 6, 8)
val doubles = Array(1.0, 2.0, 3.0)
doubles filter (_ < 3) // returns Array[Double] = Array(1.0, 2.0)
Почему этот принцип не выполняется для таких методов, как seq
, par
, view
, force
?
numbers.view.map(2*).force
// returns Seq[Int] = List(2, 4, 6, 8)
numbers.seq
// returns scala.collection.immutable.Seq[Int] = List(1, 2, 3, 4)
doubles.par.seq
// returns scala.collection.mutable.ArraySeq[Double] = ArraySeq(1.0, 2.0, 3.0)
Существует ли техническое ограничение, которое мешает его работе?Или это по замыслу / намерению?Учитывая, что LINQ в основном ленив, эквивалент Scala (view
, force
) не является более безопасным для типов (только при использовании строгих методов), верно?