私はImmutable.jsや投稿者の専門家ではありませんが、私は不変のデータ構造にいくつかの考えを書き留めようとします。
Immutable.jsはパフォーマンスを最適化しています。特に等価チェックを実行する場合不変の背後にあるアイデアは、不変のデータ構造があれば、参照を比較するだけで構造が変わったかどうかを判断できるということです。 Immutable.is
のimplementionが最初に行うことがチェックしているが参照が等しい場合:それらが同じであれば、それは不変であるため、
export function is(valueA, valueB) {
if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {
return true;
}
// ...
}
、私たちは常に、構造がまだ同じであると仮定することができます。すべての空リストを同じにするとここでパフォーマンスが向上します。
また、不変のデータ構造が関数型プログラミング言語(Immutable.js is actually inspired by Scala and Closure)で広く使用されていることも理解しておく必要があります。関数型プログラミング言語は、他の言語よりも数学に非常に近い。数学は価値ベースであり、数学ではインスタンスが存在しないことを意味します。要素1,2および3を含む集合は、1,2および3の集合と等しいと仮定する。空集合は、空集合と常に等しい。空のリストは空のリストと等しくなります。 ScalaのREPLから
いくつかの興味深い結果:私はそれはバグではないと思うに傾いている理由である
scala> List(1, 2, 3) == List(1, 2, 3)
res0: Boolean = true
scala> Nil == Nil
res1: Boolean = true
scala> 1 :: 2 :: 3 :: Nil == List(1, 2, 3)
res2: Boolean = true
。しかし、 '新しいImmutable.List([1,2,3])===新しいImmutable.List([1,2,3])' は真と評価されないので、ここで少し矛盾があります。空の構造を等しいと評価するのは安いですが、私は、すべてのコストをかけて深い比較を避けたいと考えています。私は、その内容にかかわらず、実際に異なるインスタンスが異なっていたという仮定の下で作業していました。したがって、私の質問です。 –