会发现()是否具有不确定性?

时间:2016-05-19 22:17:20

标签: scala find non-deterministic

我知道如果我运行一个简单的find()函数,例如(1 to 5).find(_ < 6),我将永远回复Some(1)

此处,find()是确定性的,并且将始终返回相同的结果,即使集合(1 to 5)包含使谓词_ < 6为真的其他四个元素。

我的问题是 - find()能否做出不确定的行为?

是否存在使collection.find(predicate)为连续执行返回不同结果的集合和/或谓词?

1 个答案:

答案 0 :(得分:3)

对于线性序列,find将始终线性地进行,因此它将始终返回相同的元素。

对于非线性集合,例如Set

,情况不一定如此
Set(1 to 5: _*).find(_ < 6) // Some(5)
Set(1 to 5: _*).find(_ < 6) // Some(5)

这里有一个不同的元素,尽管由于价值相等,实现似乎是确定性的。

这种平等很容易被打破:

// reference equality
class Box(val peer: Int) { override def toString = peer.toString }

def mkIndet() = Set((1 to 5).map(new Box(_)): _*)

mkIndet.find(_.peer < 6) // "random"
mkIndet.find(_.peer < 6) // "random"
mkIndet.find(_.peer < 6) // "random"

另一个案例是并行集合:

def par() = (1 to 10000).par.find(i => i % 1000 == 0)

par()  // "random"
par()  // "random"
par()  // "random"