問題タブ [structural-equality]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
4222 参照

f# - F# の構造的等価性

関数を含むレコード タイプがあります。

このタイプには構造的な平等が必要です。bar等式テストで無視する必要があることをマークできる方法はありますか? または、これを回避する他の方法はありますか?

0 投票する
1 に答える
341 参照

dictionary - 2 次元配列の IEqualityComparer インスタンス

=F# は、演算子を使用した 2 次元配列の構造上の等価性をサポートしており、 Set. しかし、.NET クラスで同じ等価比較を使用するにはどうすればよいHashSetでしょうか? デフォルトでは、参照等価性が使用されます。インスタンスを取るコンストラクターがありますがIEqualityComparer<T>、2 次元配列に適した組み込みインスタンスが見つかりません。

を見ましたSystem.Collections.StructuralComparisons.StructuralEqualityComparerが、2 つの問題があるようです。第一に、それは一般的ではなく、第二に、2 次元配列をサポートしていないようです:

最終的には、2 ではなく 1 を返すように次のコードを修正したいと思います。

を使用したソリューションにも満足していDictionaryますが、同じ問題が当てはまると思います。

0 投票する
4 に答える
820 参照

c# - IEquatable を実装するT が IEnumerable になる場合

私に似たさまざまな質問を読みましたが、どれも私の問題に対処していないようです。

私はこのようなタイプを持っています:

等式が正しく機能するときTはスカラーですが、等号のようなものを定義すると失敗します。MyObject<int>MyObject<IEnumerable<int>>

その理由は、 T のときIEnumerable<T>に を呼び出す必要があるからthis.Value.SequenceEqual(other.Value)です。

この違いを処理Equals(MyObject<T>)すると、型チェックとリフレクションの LOC が多すぎます (私にとっては、SOLID/SRP の違反につながります)。

MSDN ガイドラインでこの特定のケースを見つけることができなかったので、誰かがすでにこの問題に直面している場合は、この知識が共有できれば素晴らしいことです。

編集:代替

KISSに、私は似たようなことをしたいと思っています:

このようにして、の実装はEqual非常に簡単になります。値が 1 つだけ必要な場合は、1 つのアイテムのコレクションがあります。明らかに、 T は列挙可能ではありません (ただし、データ構造はプライベートであるため、問題はありません)。

0 投票する
2 に答える
137 参照

.net - IStructuralEquatable オブジェクトの安定したハッシュコード

オブジェクトの安定した (= 時間とともに変化しない) ハッシュコードを作成する必要があります。具体的には、オブジェクトの正確なタイプがわかりません。私が行う唯一の仮定は、それが IStructuralEquatable から継承されているということです。

だから私は方法が必要です:

.Net フレームワークはこのタイプの機能を提供しますか? それ以外の場合、どのアルゴリズムを使用しますか?

0 投票する
1 に答える
1120 参照

c# - 配列の構造比較

F# の場合:

一般に、C# または .NET BCL の場合:

なんで?


追記:

私が「正しい」Equalsを持っていると思った理由は、これが真実であることが判明したからです:

0 投票する
2 に答える
496 参照

dictionary - .NET ミュータブル ディクショナリの作成方法F# の StructuralComparison & Equality を使用

F# には MAP があることは知っていますが、.NET ディクショナリを使用したいと考えています。この dict には、文字列としてのキーと F# 値 + dict としての値があります。

さて、私が解決したい問題は、RelationC 型に構造的等価性を提供する方法です。実際のストレージをカプセル化する必要がある場合、どのようにディクショナリの代わりとなるコンテナを作成し、それを変更可能な操作に使用し、構造的な同等性を持たせますか?


現在の回答では、このコードは機能しません(実装は完全ではありませんが、これはコンパイルさえできません):

これはエラーです:

エラー FS0377: この型は、属性 'NoEquality'、'ReferenceEquality'、'StructuralEquality'、'NoComparison'、および 'StructuralComparison' の無効な組み合わせを使用しています (FS0377)

0 投票する
1 に答える
681 参照

algorithm - テーブルのキー自体がテーブルである可能性がある循環参照を含む可能性のある 2 つの lua テーブルを構造的に詳細に比較するにはどうすればよいですか?

この質問は、以前に投稿された質問「How can I deep-compare 2 Lua tables, which may or not have tables as keys?」に似ています。

問題は、そこにあるソリューションは、単純な詳細比較に最適です。ただし、循環参照は適切に処理されません。より具体的には、次のとおりです。

スタック オーバーフローを生成します。また、スタック オーバーフローがなければ、代わりに誤検知が発生する可能性があります (テストできるわけではありません)。

この場合、どうすればよいですか?(でも扱えるのか? そう考えると計算機科学の未解決問題のように聞こえるが……よくわからない)


「構造的同等性」とは、次の表を意味します。

次の表とは構造的に異なります。

一方、「コンテンツの平等」では、それらは等しいでしょう。


テストケース:

0 投票する
1 に答える
259 参照

functional-programming - 構造的平等を定義するものは何ですか?

構造的平等の観点から、

(equal? (list 'a 'b))true と評価されるのに false と評価されるのはなぜ(equal? (list 2 'b) '(2 'b))ですか?