soc*_*soc 8 c# linq collections types scala
集合框架的大部分实现复杂性源于这样一个事实:Scala可以 - 不像C#的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)
Run Code Online (Sandbox Code Playgroud)
为什么这个原则不能保持类似的方法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)
Run Code Online (Sandbox Code Playgroud)
是否有技术限制阻止其工作?或者这是设计/意图?考虑到LINQ基本上是懒惰的,Scala的等价物(view,force)不是更加类型安全的(只有在使用严格的方法时),对吧?
可以将更多类型信息嵌入到并行集合类中,以便您可以返回已经开始的集合,这是真的.这意味着把一个后List成ParVector通过调用par(在为O(n),因为元素被复制到载体中),然后调用seq,你将再次得到List.要获取列表seq,您必须将向量中的所有元素复制回列表.相反的是:
ParVector被转换回Vector时seq被调用-它得到为O转换(1)par再次调用此向量将给出一个ParVectorO(1),因为它们都是向量并且并行向量共享相同的基础数据请注意,当转换为并行集合时,必须重新构建诸如列表之类的集合,否则无法有效地并行化对其的操作.
因此,你不必调用当重复支付复制par和seq-的转换变得更加高效.由于并行收集的主要目标是提高效率,因此这被认为比统一返回类型原则更重要.
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |