2016-06-28 1 views
1

フィーチャーまたはバグ:すべて空です。あなたは同じように、すべての空のリストを検討する必要がありますなぜすべて空です。変更不可リストは同一です

var xxx = new Immutable.List(); 
var yyy = new Immutable.List(); 
xxx === yyy; // true 

var zzz = yyy.push(1).pop(); 
zzz === yyy; // true 

zzz = Immutable.fromJS([]); 
xxx === zzz; // true 

は、私が見ることができますが、私はまた、彼らはしていることを意味するものではないという理由だけで2つのリストが空であるユースケースを持っている:例えば

同じ。反例として、同じ内容の2つのImmutable.Listsを作成すると、同じものとしてテストされません。

2つの空のリストを区別する方法はありますか?

これはバグだと思いますか?

答えて

0

私は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 
+0

。しかし、 '新しいImmutable.List([1,2,3])===新しいImmutable.List([1,2,3])' は真と評価されないので、ここで少し矛盾があります。空の構造を等しいと評価するのは安いですが、私は、すべてのコストをかけて深い比較を避けたいと考えています。私は、その内容にかかわらず、実際に異なるインスタンスが異なっていたという仮定の下で作業していました。したがって、私の質問です。 –

関連する問題