2016-01-15 1 views
7

機能的なデータ構造(Haskell/Clojure/Scalaで使用されるHash Array Mapped Trieなど)は、基礎となるデータ構造で多くの共有に依存しています。たとえば、通常、データ構造を実装するツリー上のパスコピーによって実装されるマップ形式のデータ型にinsertを実装するとします。Rustの借用ルールは、機能的なデータ構造の中に入りますか?

これらのデータ構造は、基本的な値の共有(およびプリンシパル所有者のない)に大きく依存していることを考えると、借用はそのような構造を実装する方法になりますか?

+0

言い換えれば、この質問は広すぎたり、意見に基づいているようです。何か試してもうまくいきませんでしたか?あなたは「不安全」が提供する「エスケープハッチ」を認識していますか?どのような答えがここで有効でしょうか? [ハムレット](https://crates.io/crates/hamt/)がありますが、それは答えを提供しますか? – Shepmaster

+3

[この質問](https://stackoverflow.com/questions/31227269/generic-types-ownership-and-persistent-data-structures?rq=1)への回答をご覧ください。 'Rc'は同じデータの複数の所有者を許し、' .clone() 'のように見えるかもしれないが、実際にはデータをコピーしない浅いコピーです。これは実際にはこれを可能にする不変性です。ハムレットボックスは 'Rc' [here](https://github.com/rainbowbismuth/hamt-rs/blob/master/src/lib.rs#L801)を使います。 –

+0

共有不変所有権は、GCを明示的にすることによって一般に単純です。サイクリックデータは問題の部分です。 – Veedrac

答えて

8

短い回答:いいえ

ロング回答:

錆が実際に不変の構造と非常によく動作します(これは、例えばCのconst以上の保証を提供します)。

共有所有権は本当に不変の値を持つ問題ではなく(Rc/Arc)、不変構造に複数回も簡単に借りることができます。借りている間は移動することはできませんが、参照の代わりに所有プロキシを渡すことで回避できます(RcまたはArc)。

ハスケルにない可能性がある1つの問題は、CellまたはRefCellという可変値を混合しているため、サイクルを作成でき、RustにはGCがないため収集できません。

関連する問題