2016-10-26 4 views
5

は、それが使用シナリオにタイププロバイダを経由してジェネリック型の作成

#r @".\bin\Debug\SampleTypeProvider.dll" 
type A = SampleTypeProvider.A 
type intA = A<int> 
type strA = A<str> 

そして、それがある場合にになりますように

[<TypeProvider>] 
type SampleTypeProvider(config: TypeProviderConfig) as this = 

... 
//the below would be the generated type 
type A<'b>() = 
    member this.C() : 'b = ... 
    member this.D() : 'b = ... 
// 
... 
[<assembly:TypeProviderAssembly>] 
do() 
    .... 

ように、タイププロバイダを経由してジェネリック型を作成することが可能です可能 - どのように私はそれに近づけることができます。

答えて

4

これは標準的な方法では不可能です。私は周りを見回してみましたが、標準的な参照は見つかりませんでしたが、これは既知の制限であり、制限を解除するためのさまざまな提案がありました。

Ross McKinlayには、タイププロバイダが実行されたときに実際にF#ソースコードでファイルを生成することによって、この問題を回避する、ややこしいプロジェクトがMixin type providerとなっています(プロジェクトにこのファイルを含めることもできます)。これはおそらくタイププロバイダよりもコード生成が多いですが、彼のtalk about the topicもいくつかの制限の良い説明です。

これに対処する方法は、タイププロバイダの目的によって異なります。限られた数の型だけが必要な場合は、静的パラメータのようなものを使用し、A<"int">またはA<"string">と書くことができます。また、通常の提供されていないジェネリックタイプと非ジェネリックタイプのタイプを混在させることもできます(巧妙な方法で)。しかし、より良い答えを得るために具体的なユースケースについて詳しく書く必要があると思います。

+0

sigh。私はあなたが与えたものを期待していたのとは別の答えを期待していました。 – robkuz

関連する問題