問題タブ [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.
f# - F# の構造的等価性
関数を含むレコード タイプがあります。
このタイプには構造的な平等が必要です。bar
等式テストで無視する必要があることをマークできる方法はありますか? または、これを回避する他の方法はありますか?
dictionary - 2 次元配列の IEqualityComparer インスタンス
=
F# は、演算子を使用した 2 次元配列の構造上の等価性をサポートしており、 Set
. しかし、.NET クラスで同じ等価比較を使用するにはどうすればよいHashSet
でしょうか? デフォルトでは、参照等価性が使用されます。インスタンスを取るコンストラクターがありますがIEqualityComparer<T>
、2 次元配列に適した組み込みインスタンスが見つかりません。
を見ましたSystem.Collections.StructuralComparisons.StructuralEqualityComparer
が、2 つの問題があるようです。第一に、それは一般的ではなく、第二に、2 次元配列をサポートしていないようです:
最終的には、2 ではなく 1 を返すように次のコードを修正したいと思います。
を使用したソリューションにも満足していDictionary
ますが、同じ問題が当てはまると思います。
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 は列挙可能ではありません (ただし、データ構造はプライベートであるため、問題はありません)。
.net - IStructuralEquatable オブジェクトの安定したハッシュコード
オブジェクトの安定した (= 時間とともに変化しない) ハッシュコードを作成する必要があります。具体的には、オブジェクトの正確なタイプがわかりません。私が行う唯一の仮定は、それが IStructuralEquatable から継承されているということです。
だから私は方法が必要です:
.Net フレームワークはこのタイプの機能を提供しますか? それ以外の場合、どのアルゴリズムを使用しますか?
c# - 配列の構造比較
F# の場合:
一般に、C# または .NET BCL の場合:
なんで?
追記:
私が「正しい」Equalsを持っていると思った理由は、これが真実であることが判明したからです:
dictionary - .NET ミュータブル ディクショナリの作成方法F# の StructuralComparison & Equality を使用
F# には MAP があることは知っていますが、.NET ディクショナリを使用したいと考えています。この dict には、文字列としてのキーと F# 値 + dict としての値があります。
さて、私が解決したい問題は、RelationC 型に構造的等価性を提供する方法です。実際のストレージをカプセル化する必要がある場合、どのようにディクショナリの代わりとなるコンテナを作成し、それを変更可能な操作に使用し、構造的な同等性を持たせますか?
現在の回答では、このコードは機能しません(実装は完全ではありませんが、これはコンパイルさえできません):
これはエラーです:
エラー FS0377: この型は、属性 'NoEquality'、'ReferenceEquality'、'StructuralEquality'、'NoComparison'、および 'StructuralComparison' の無効な組み合わせを使用しています (FS0377)
algorithm - テーブルのキー自体がテーブルである可能性がある循環参照を含む可能性のある 2 つの lua テーブルを構造的に詳細に比較するにはどうすればよいですか?
この質問は、以前に投稿された質問「How can I deep-compare 2 Lua tables, which may or not have tables as keys?」に似ています。
問題は、そこにあるソリューションは、単純な詳細比較に最適です。ただし、循環参照は適切に処理されません。より具体的には、次のとおりです。
スタック オーバーフローを生成します。また、スタック オーバーフローがなければ、代わりに誤検知が発生する可能性があります (テストできるわけではありません)。
この場合、どうすればよいですか?(でも扱えるのか? そう考えると計算機科学の未解決問題のように聞こえるが……よくわからない)
「構造的同等性」とは、次の表を意味します。
次の表とは構造的に異なります。
一方、「コンテンツの平等」では、それらは等しいでしょう。
テストケース:
functional-programming - 構造的平等を定義するものは何ですか?
構造的平等の観点から、
(equal? (list 'a 'b))
true と評価されるのに false と評価されるのはなぜ(equal? (list 2 'b) '(2 'b))
ですか?