標準のClojureマップとセットは不変(かつ永続的)です[1]ので、並行プログラムでも同様に動作します。要件に応じてref/agent/var/atomに格納したい場合があります。ref/agent/var/atomをこれまでどおりに更新することができます。
あなたは値がこのように、実際に参照文献であれば、より多くの可変マップを持つことができます。
{:a (ref #{1 2 3})
:b (ref #{4 5 6})}
この場合は、あなたが実際にすでにのトランザクションにキーを(既存する値を追加することができますコース)。追加、
は
user=> (def mmap {:a (ref #{1 2 3}) :b (ref #{4 5 6})})
#'user/mmap
user=> mmap
{:a #<[email protected]: #{1 2 3}>, :b #<[email protected]: #{4 5 6}>}
user=> (def mmap2 (assoc mmap :c (ref #{7 8 9})))
#'user/mmap2
user=> mmap2
{:C#<[email protected]: #{7 8 9}>, :a #<[email protected]: #{1 2 3}>, :b #<[email protected]: #{4 5 6}>}
user=> mmap
{:a #<[email protected]: #{1 2 3}>, :b #<[email protected]: #{4 5 6}>}
user=> (dosync (alter (:a mmap2) conj 0))
#{0 1 2 3}
user=> mmap
{:a #<[email protected]: #{0 1 2 3}>, :b #<[email protected]: #{4 5 6}>}
user=> mmap2
{:C#<[email protected]: #{7 8 9}>, :a #<[email protected]: #{0 1 2 3}>, :b #<[email protected]: #{4 5 6}>}
[1]それは次のとおりです。キーの追加や削除は、まだ元のマップと同じ引用文献を共有することになる、新しいマップを返し、ので、それらのいずれかに変更が他の人に表示されます/キーを削除/変更すると、元の値を変更せずに値が実際に新しいマップを返します。
は、それはHaskellは変異を許可していない一般的な誤解です。します。キャッチされているのは、すべての突然変異が型に正式に記載されなければならないということです。したがって、突然変異操作を一緒に構成する典型的な方法は、モナドインターフェースである。 HaskellersはScalaとClojureと同じようにmutabilityに "後退"することができますが、ハスケルを除いて、あなたが不正行為をすることはできません。しかし、あなたが完全にあなたの関数に変異をカプセル化することができれば、それは純粋なインターフェースをさらすことができます。 –