以下要点中的代码几乎是从 Martin Odersky在Coursera上的 Scala 函数式编程原理课程的讲座中逐字提取的:
https://gist.github.com/aisrael/7019350
问题发生在第 38 行,在unionin class的定义中NonEmpty:
def union(other: IntSet): IntSet =
// The following expression doesn't behave associatively
((left union right) union other) incl elem
使用给定的表达式 ,((left union right) union other)需要largeSet.union(Empty)花费过多的时间来完成包含 100 个或更多元素的集合。
当该表达式更改为 时(left union (right union other)),联合操作相对立即完成。
添加:这是一个更新的工作表,它显示了即使使用具有随机元素的较大集合/树,表达式 ((left ∪ right) ∪ other) 可能会永远持续,但 (left ∪ (right ∪ other)) 会立即完成。