問題タブ [discriminated-union]
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# 判別共用体インスタンスの比較
まず、お粗末なタイトルについてお詫び申し上げます。私は、問題をより適切に説明するのに十分な F# を理解していません。
次の単純な DU を考えてみましょう。
お金をさまざまな通貨で表し、安全にお金 + お金を実行できるように (+) 演算子をオーバーロードしています。しかし、多くの通貨を持っている場合、match ステートメントを書くのは面倒になります。次のような表現方法はありますか。
または、同じ結果を達成する別の方法はありますか? ここで説明されている制限のために、測定単位を考慮して破棄しました。
f# - F# のパラメーター化された判別共用体
重複の可能性:
関数適用による型付き抽象構文木
私は次のことをしたいと思います
つまりApply
、関数 と at を取り、 f を の「コンテンツ」に適用しますt
。
ただし、 を要求するt<'a, 'b, 'c>
ため、すべての に対して 3 つのパラメーターを使用する必要がありますt<_>
。それを回避する方法はありますか?
あなたの洞察に感謝します
f# - F#で、識別された共用体で厳密に計算してメモ化します
私は次のような差別化された組合を持っています
これは基本的にリンクリストであり、コンテンツは含まれていませんSpam(Spam(Spam(Eggs)))
。長さを数えるなど、この構造を厳密に計算して、その結果を記憶したいと思います。通常のタイプでは、クラスローカルlet
バインディングを使用しますが、それらは識別された共用体では使用できません。
これを行う1つの方法は、
しかし、必要なデータが簡単に計算できる場合、これは本当に厄介ですが、それでも(外部の可変構造を使用せずに)より良い方法があることを願っています。
design-patterns - 被差別共用体を拡張するための「設計パターン」
クラス継承が「開いた」型階層であり、識別共用体が「閉じた」型階層であることはよく知られています。ただし、新しいサブクラスを追加するのは簡単ですが、新しい仮想関数を追加するには、既存のすべてのクラスを変更する必要があります。一方、判別共用体は新しい機能を簡単に追加できます。
OOP は、「型階層に新しいメソッドを追加する」という難しさを経験してきたほど十分に存在しており、「すべてのクラスを変更する」ことが適切な選択肢ではない場合、Visitor パターンのようなものを考え出しました。既存のタイプに新しい機能を追加します。
例えば:
仮想を追加するのBase.h()
は難しいため、ビジター パターンを使用して、将来の機能をカプセル化できるようにします。これは基本的に、パターンマッチ関数の継承ベースのアナログです!
TLDR:判別共用体への型の追加を扱う一般的に見られる抽象化 (Visitor パターンに類似) はありますか?
f# - F#パターン識別子としてジェネリック型を使用
以下で私がやろうとしていることを達成する別の方法がある場合は、私に知らせてください。次のサンプルコードがあるとします
isFooの汎用/高次バージョンを作成して、他のすべてのタイプの識別された共用体(この場合はBar)に基づいてリストをフィルター処理できるようにします。
次のようなものです。ここで、'aはFooまたはBarのいずれかです。
ただし、この試行では次のエラーが発生します。
エラーFS0039:パターン弁別器「a」が定義されていません
list - F#共用体タイプのリスト
レポートのリストが欲しいのですが。レポートは、詳細タイプまたはセクションタイプのいずれかになります。
次に、私のコードで、次のことを実行したいと思います。
コンパイラは、最初のケースで「式はReport型であると予想されていましたが、ここではDetail型である」と文句を言い、2番目のケースでも同様に文句を言います。
そんなことをしたいと思っているのでしょうか。問題について別の考え方をする必要がありますか?レポートは詳細または要約のいずれかであるため、レポートのリストは詳細または要約のいずれかを受け入れるべきではありませんか?詳細または要約のリストではない場合、レポートリストとは何ですか?
ありがとう。
list - Union 型の F# リストの操作
これは、 F# List of Union Typesでの私の質問の続きです。有益なフィードバックのおかげで、または のいずれかでReport
ある のリストを作成することができました。もう一度データ定義を次に示します。Report
Detail
Summary
Report
という変数に のリストを取得したのでreports
、これらのオブジェクトを繰り返し処理しReport
、それぞれに基づいて操作を実行したいと思います。Detail.Divisions
または のいずれかを扱う場合を除いて、操作は同じSummary.Office
です。明らかに、私はそれらを別の方法で処理する必要があります。State
しかし、同様のものを処理するためのすべてのコードを複製したくはありませんSections
。
私の最初の(実用的な)アイデアは次のようなものです:
Detail.Divisions
これにより、ではなく、いつ処理するかを知る方法が得られますSummary.Office
。しかし、それは私に作業するオブジェクトを与えません。私はまだ に固執しておりreport
、それがどれであるか、Detail
またはSummary
であることがわかりません。また、属性にアクセスすることもできません。report
適切なDetail
orに変換しSummary
、同じコードを使用していずれかのケースを処理したいと思いますが、 Detail.Divisions
andは例外ですSummary.Office
。これを行う方法はありますか?
ありがとう。
f# - 識別共用体型宣言内でのアクティブ パターンの使用
差別化された共用体型宣言内でアクティブ パターンを使用することは可能ですか?
より正確には、次のおもちゃの例を考えてみましょう。
ここで、T で ToString() をオーバーライドしたいとします。T の型宣言内では、T_ToString がその時点でまだ宣言されていないため、T_ToString を参照できません。ToString() の前にアクティブなパターンと T_ToString を移動することはできません。これは、その時点では T がまだ宣言されていないためです。しかし、これもうまくいきません:
f# - 識別された共用体の推論を理解する
次のコードを検討してください...
コメントのように、戻り結果が共用体タイプである必要があると推測する方法はないようです。共用体タイプで修飾されたアクセスを要求する必要がある場合、これは非常に冗長です(これは心配そうに間違っているようです)。
また、共用体型のみを受け取り、それらを共用体として返す関数を作成する方法もありません。(この場合、TypeOneまたはTypeTwoを受け取り、UnionTypeを返す関数)。それともありますか?差別化された組合と協力するためのより良い方法はありますか?
f# - ファイル/データベースから判別共用体データを作成する
このような式の識別共用体があります (EQ =; GT >; など)
ファイル/データベースに保存されたそのような式から DU のインスタンスを作成したいと考えています。どうすればいいのですか?実現不可能な場合、F# でアプローチする最善の方法は何ですか?
Daniel: これらの式は (上記のように) プレフィックス形式でテキストとして保存され、F# で解析されます。ありがとう。