クールな新しい F# 3.0 機能型プロバイダーを使用して、F# のデータ型またはクラスと、XML や WSDL などのデータ ソース構造との間の不一致を埋めることができます。ただし、この不一致は、C# などの他の .NET 言語でも問題になります。
C# コードで F# 3.0 プロバイダーを使用したいと考えています。どうすればこれを行うことができますか?さらに、できない場合、C# 実装でそれらを使用できるようにするために何が必要でしょうか?
クールな新しい F# 3.0 機能型プロバイダーを使用して、F# のデータ型またはクラスと、XML や WSDL などのデータ ソース構造との間の不一致を埋めることができます。ただし、この不一致は、C# などの他の .NET 言語でも問題になります。
C# コードで F# 3.0 プロバイダーを使用したいと考えています。どうすればこれを行うことができますか?さらに、できない場合、C# 実装でそれらを使用できるようにするために何が必要でしょうか?
@kvb は、いくつかの技術的な問題の概要を説明していると思います。型推論が問題になることに同意します。基本的に、匿名型と同様に、プロバイダーによって生成された型をローカルで使用することに制限されます。私は C# が Roslyn に似たようなものを持ってくるかもしれないと思いますが、F# のようにエレガントかつスムーズに統合されるとは思えません (型プロバイダーは実際には言語機能であり、ツールだけではありません)。
あなたの2つの特定の質問に答えるには:
[どうすれば] C# コードで F# 3.0 プロバイダーを使用できますか?
F# 型プロバイダーは、実際には F# コンパイラによってのみ認識されるため、F# から使用する必要があります。生成型プロバイダー (SQL、エンティティ、WSDL、構成ファイル) の場合、F# からプロバイダーを参照し、C# プロジェクトから生成された型を使用できます。
型プロバイダーを消去する場合、型は実際には存在せず、F# のみが参照できるため、これを行うことはできません。したがって、F# で処理コードを記述し、C# から簡単に使用できるレコードまたはその他の型のコレクションとして結果を返すことが最善の方法です。
それらを使用できるようにするには、C# 実装で何が必要ですか?
もちろん、「C# は型プロバイダーをサポートする必要があります!」と言うことができますが、さらにいくつかの考えがあります。型プロバイダーは単なる .NET アセンブリであり、F# 固有の型は使用しません。ITypeProvider
インターフェイスは、C# を含む任意の .NET 言語で使用できるため、C# の設計者が必要に応じて、F# 用に既に構築されている優れたプロバイダーをすべて再利用できます。
したがって、この提案をC# ユーザーの声に送信するか、他の場所で支持してください (または、Mono チームにこれを実装するよう説得してください!)。おそらく C# に追加されるでしょう ( vNext + 1 + ...
)。現時点では、F# でのみすべての利点が得られます。
型プロバイダーの動作方法のいくつかの側面は、特に F# プログラマーのニーズに合わせて調整されていますが、他の言語の厳密に型指定されたデータ アクセスのソリューションを検討する場合は、あまり魅力的ではない可能性があります。たとえば、多くの F# プログラミングは F# Interactive で行われます。型プロバイダーは、コード ジェネレーター (ソース コード ファイルを生成するための言語外部メカニズムを必要とする) と比較して、このワークフローを非常にうまく実現します。C# プログラマーは、編集、コンパイル、実行のサイクルが遅いことに慣れているため、C# 設定ではこれはあまり重要ではありません。
技術的な観点からは、C# などの言語と比較して、F# のより広範な型推論がおそらく最大の利点であると思います。たとえば、型プロバイダーのデータ アクセス ロジックを別の型でラップする場合は、次のようにします。
let moviesStartingWith prefix =
query {
for movie in MyDataSource.Movies do
where (movie.Title.StartsWith(prefix) }
|> Seq.toList
C# では、戻り値の型 (例: List<DataSource.ServiceTypes.Movie>
) を指定する必要がありますが、これは面倒な作業になります。つまり、IntelliSense を使用しても、提供された型のセットを点線で指定して署名を生成するだけでなく、署名を生成することになります。クエリを生成するために提供された値のセット。
もちろん、これは型プロバイダー以外の領域にも当てはまりますが、一部のプロバイダーによって自然に生成されるネストされた型階層の一部では、型名が非常に長くなるため、実際には特に苦痛になると思います。