Rust 的借用规则是否妨碍了功能数据结构?

Do Rust's borrowing rules get in the way of functional data structures?

函数式数据结构(例如 Haskell/Clojure/Scala 中使用的 Hash Array Mapped Trie)依赖于底层数据结构中的大量共享。例如,如果我们在类似地图的数据类型上实现 insert,该数据类型通常通过在实现数据结构的树上进行路径复制来实现。

鉴于这些数据结构在很大程度上依赖于共享(并且没有主要所有者)潜在价值,借用会妨碍实现此类结构吗?

简答:

长答案:

Rust 实际上可以很好地处理不可变结构(例如,它比 C 的 const 提供更多保证)。

共享所有权没有问题(Rc/Arc),具有真正不可变的值,您可以轻松地多次借入不可变结构。借用时你不能移动,但这可以通过分发拥有代理(再次通过 RcArc)而不是引用来规避。

在 Haskell 中你可能没有的 Rust 问题是将可变值与 CellRefCell 混合,因为你可以创建循环,而那些不会收集是因为 Rust 没有 GC。