以下要点中的代码几乎是从 Martin Odersky在Coursera上的 Scala 函数式编程原理课程的讲座中逐字提取的:
https://gist.github.com/aisrael/7019350
问题发生在第 38 行,在union
in 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)) 会立即完成。