2

を生成するReflection.Emitを使用しました。、私はそれが<code>Reflection.emit</code>使用して、F#でDUを生成することが可能であった場合(または何かをそこにあります)知っているように、あるいは、すでにDUを定義し、新しい例を追加します識別型共用体

私は、MSDNのWebサイトを見てきた、と私は私にできることすべては労働組合の例を取得したり、組合の例を作成することであることが分かりました。 FSharpValue.MakeUnionを使用するか、Expr.NewUnionCaseとの引用を使用して作成してください。

私は、このメソッドを使用して持っている問題は、私は私が作った組合の例は、同じDUに属しているような方法でそれらを結合することができるだろうかありますか?たぶんそれはこの問題を解決する道ではない。その場合、私はどのようにDUを動的に生成するでしょうか?

P.S:目的はタイププロバイダの内部でDUを生成することです。私は間違っていないよ場合、これは、.dllファイルにコンパイルするとき、私は、スクリプトファイル内のTypeProviderによって生成されたDUにアクセスできるようになることを、意味します。つまり、私はDUのインスタンスに対してパターンマッチングを適用することができ、DUによって提供される型安全性(例えば、パターンマッチングにおけるすべてのケースの徹底性)を得ることができることを意味する。

答えて

6

私は動的に判別共用体を生成するF# Compiler Servicesを見て必要があります。基本的には、F#コンパイラを使用して必要な型を生成しています。私の限られた理解は、レコードと差別化された共用体の両方が、F#コンパイラがそれらをそのように認識するための型の外である種のアセンブリメタデータを必要とすることです。 Reflection.Emitルートを経由した場合は、そのAPIを介して可能な場合は、生成されたアセンブリにこのメタデータが含まれていることを確認する必要があります。

タイププロバイダは、F#4.0のよう今レコードと区別組合を公開することはできません。 a F# Uservoice suggestion for itがあります。それはおそらく言語にそれを作る前になります。上記のコンパイラサービスを使って共用体を生成し、内部にパターンマッチを持つ "Match"メンバを追加します。それは型提供者の仕組みを通っていても機能するが、それは正式な「DU」ではない。

+0

ご説明いただきありがとうございます。私は現在あなたが提案したことをやろうとしていますが、F#コンパイラサービスを使用してどのようにDUを生成するかはわかりません。私が見つけた唯一の事は、次のCompiler.SourceCodeServices.FSharpUnionCaseですが、私の理解では、既存の共用体のケースに関する情報しか得ることができません。私は試していますが、コンパイラサービスを使用してどのような型を生成することができないのか分かりません。 – Leleutch

+0

ドキュメントの「F#コンパイラのホスティング」を参照してください。あなたはそれにコードを与え、それを使用する方法に応じて通常または動的アセンブリのいずれかを作成します。あなたがしなければならないことは、あなたのdiscrminated unionを表すコードを与えることだけです。 – akara

+0

おお、私は見ているので、実際に何かかわいい印刷物のように見えます。もちろん、すでに異なるタイプ(type1 .. typeNなど)が定義されている場合は、それらをDUのコードに追加することができ、DUが実際にバインドされることを意味します。今、私は分かる。ありがとう – Leleutch

関連する問題

 関連する問題