2016-01-15 9 views
7

Funktionelle Datenstrukturen (wie das Hash Array Mapped Trie, das in Haskell/Clojure/Scala verwendet wird) beruhen auf einer großen Anzahl von Teilen in der zugrunde liegenden Datenstruktur. Beispiel: Wenn wir insert für einen kartenähnlichen Datentyp implementieren, der normalerweise durch Kopieren des Pfads in der Baumstruktur implementiert wird, die die Datenstruktur implementiert.Beherrschen Raus Schuldenregeln funktionale Datenstrukturen?

Angesichts der Tatsache, dass diese Datenstrukturen eine Menge teilen (und keine Haupteigentümer der zugrunde liegenden Werte), wird Kreditaufnahme in die Art und Weise der Umsetzung solcher Strukturen?

+0

Wie gesagt, diese Frage scheint übermäßig breit oder Meinung basiert. Hast du etwas versucht und hat es nicht funktioniert? Kennen Sie die "Fluchtluke", die "unsicher" bietet? Welche Art von Antwort wäre hier gültig? Es gibt eine [Hamst Kiste] (https://crates.io/crates/hamt/), liefert das eine Antwort? – Shepmaster

+3

Siehe die Antwort auf [diese Frage] (https://stackoverflow.com/questions/31227269/generic-types-ownership-and-persistent-data-structures?rq=1). Es erklärt, dass 'Rc' mehreren Eigentümern der gleichen Daten erlaubt, und während es aussieht, als ob '.clone()' eine Kopie erstellt, ist es eine flache Kopie, die die Daten nicht wirklich kopiert. Es ist eigentlich Unveränderlichkeit, die dies ermöglicht. Die Hamt-Kiste verwendet 'Rc' [hier] (https://github.com/rainbowbismuth/hamt-rs/blob/master/src/lib.rs#L801). –

+0

Geteilte unveränderliche Eigentumsrechte sind in der Regel einfach, wenn Sie GC explizit machen. Zyklische Daten sind der problematische Teil. – Veedrac

Antwort

8

Kurze Antwort: No.

Lange Antwort:

Rust tatsächlich funktioniert sehr gut mit unveränderlichen Strukturen (es gibt mehr Garantien als C des const zum Beispiel).

Das gemeinsame Eigentum ist kein Problem (Rc/Arc) mit einem wirklich unveränderlichen Wert, und Sie können leicht mehrmals in eine unveränderliche Struktur ausleihen. Sie können sich beim Ausleihen nicht bewegen, aber dies kann umgangen werden, indem Sie anstelle von Referenzen eigene Proxies (über Rc oder Arc) aushändigen.

Das einzige Problem in Rust, die Sie nicht in Haskell haben veränderbare Werte in mit Cell oder RefCell mischt, wie Sie können dann Zyklen erstellen und diese werden nicht erfasst werden, weil Rust keine GC hat.