在 Clojure 的映射中使用不可变数据结构有什么好处?

May*_*pta 5 clojure

我在《Programming Clojure》一书的第二章中,看到了这一段——

由于 Clojure 数据结构是不可变的并且正确实现了 hashCode,因此任何 Clojure 数据结构都可以成为映射中的键。

我无法理解上面引用中提到的功能有何优势。如果有人可以通过示例帮助我理解这一点或为我指出正确的资源,我将不胜感激。

Ste*_*ott 6

当形成具有复合键(即由多条信息组成的键)的数据结构时,这可能很有用。

举一个简单的例子,假设我们有一个带有顶点的图:a :b,并且:c我们希望有一个数据结构,可以查找与任何边相关的成本度量。我们可以使用 Clojure 映射,其中每个键都是一个集合:

(def cost {#{:a :b} 5
           #{:b :c} 6
           #{:c :a} 2})
Run Code Online (Sandbox Code Playgroud)

我们现在可以查找与任何边相关的成本:

(get cost #{:c :b})  ; => 6
Run Code Online (Sandbox Code Playgroud)