Scala 视图可以与并行集合一起使用吗?

Scala 视图可以与并行集合一起使用吗?,scala,view,parallel-collections,Scala,View,Parallel Collections,在集合的映射中查找结果的习惯用法如下: list.view.map(f).find(p) 其中list是list[a],f是a=>B,p是B=>Boolean 是否可以对并行集合使用视图?我这样问是因为我得到了一些非常奇怪的结果: Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0). Type in expressions to have them evaluated. Typ

在集合的映射中查找结果的习惯用法如下:

list.view.map(f).find(p)
其中
list
list[a]
f
a=>B
p
B=>Boolean

是否可以对并行集合使用
视图
?我这样问是因为我得到了一些非常奇怪的结果:

Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val f : Int => Int = i => {println(i); i + 10}
f: Int => Int = <function1>

scala> val list = (1 to 10).toList
list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> list.par.view.map(f).find(_ > 5)
1
res0: Option[Int] = Some(11)

scala> list.par.view.map(f).find(_ > 5)
res1: Option[Int] = None
欢迎使用Scala版本2.9.1.final(Java HotSpot(TM)64位服务器虚拟机,Java 1.7.0)。
键入要计算的表达式。
键入:有关详细信息的帮助。
scala>valf:Int=>Int=i=>{println(i);i+10}
f:Int=>Int=
scala>val列表=(1到10)。toList
list:list[Int]=list(1,2,3,4,5,6,7,8,9,10)
Scala>列表.PAR.View .map(f).查找(>5)
1.
res0:Option[Int]=Some(11)
Scala>列表.PAR.View .map(f).查找(>5)
res1:选项[Int]=无
参见Martin Odersky等人的论文,该论文讨论了新的并行集合。第8页有一节“并行视图”,讨论如何将
view
par
结合使用,以及如何使视图和并行计算都具有性能优势


至于您的具体示例,这肯定是一个bug。
exists
方法也会中断,在一个列表中中断该方法会中断所有其他列表,因此我认为这是一个问题,即可能中途中止的操作(
find
exists
可以在有答案时停止)以某种方式设法中断线程池。这可能是因为。如果是这样的话,它应该在2.10中修复。

呃,不知道到底发生了什么,但产生奇怪行为的是
视图。在2.8下也是如此,它甚至没有
par
。在我看来像个bug,而且这种行为仍然存在于trunk上。@Malvolio,这很奇怪;我在没有
.par
的情况下尝试了它,它对我的效果与预期一样(结果一致
Some(11)
)。它也适用于
.par
和no
.view
,只是不适用于两者。
视图
和并行集合的概念有点……相反<代码>视图
允许您延迟使用集合,而并行集合则意味着并行使用。您如何证明使用这两种方法是合理的?@Dan我明白您的观点,但对于
find
等方法来说,这是有意义的。
ParSeqLike
中存在一个
view
方法,返回一个
ParSeqView
,这表明库设计者认为
ParSeqView
是一个有用的东西。感谢链接到那篇文章。你链接到的bug听起来不像这一个,尽管如果它是原因,那么拥有最新2.10版本的人应该能够验证。为了确保这一点,我刚刚打开了一个新的: