find() 会不确定地行动吗?
Will find() ever act nondeterministically?
我知道如果我 运行 一个简单的 find()
函数,例如 (1 to 5).find(_ < 6)
,我将永远返回 Some(1)
。
这里,find()
是确定性的,并且总是 return 相同的结果,即使集合 (1 to 5)
包含使谓词 _ < 6
为真的四个其他元素。
我的问题是 - find()
可以非确定性地行动吗?
是否存在一个集合and/or 一个谓词,它会使 collection.find(predicate)
return 连续执行的结果不同?
对于线性序列,find
将始终线性进行,因此它总是 return 相同的元素。
对于非线性集合,例如 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"
我知道如果我 运行 一个简单的 find()
函数,例如 (1 to 5).find(_ < 6)
,我将永远返回 Some(1)
。
这里,find()
是确定性的,并且总是 return 相同的结果,即使集合 (1 to 5)
包含使谓词 _ < 6
为真的四个其他元素。
我的问题是 - find()
可以非确定性地行动吗?
是否存在一个集合and/or 一个谓词,它会使 collection.find(predicate)
return 连续执行的结果不同?
对于线性序列,find
将始终线性进行,因此它总是 return 相同的元素。
对于非线性集合,例如 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"