実際、文字列さえ渡すことができればだいたいなんでもできる。他にどのような型を渡すことができるのかについても把握しておきたい。(F#)を静的引数として渡すことができる。CLI定数リテラルとしてコンパイルできないものは型プロバイダーの静的引数として渡すことができない。いずれかであるため、静的引数として渡すことができる。他のDLLに依存する型プロバイダーを作るFsBulletMLで型プロバイダーを提供するにあたって、実装はFsBulletML.CoreおよびFsBulletML.Parserに依存するようにしたい。FsBulletML.Coreは、XML形式のBulletMLをパースする機能を持っている。FsBulletML.Parserは、SXML形式とFSB形式をパースする機能を持っている。それぞれのDLLを参照してしまえば、ちょっと草植えておきますね型言語Grass型プロバイダーと同じようなノリで簡単に実装できるはずだ。実際、実装そのものは容易にできた。実行するとうまくいかない。依存対象のDLLを参照しただけではだめなのだ。型プロバイダーのコンパイルは通るが、利用時にエラーとなる。実行時には参照できないことが原因だ。参照した型プロバイダーを作る。型プロバイダーコンパイルが通るし一見良さそうに見えるが、この型プロバイダーを利用しようとすると以下のようになる。型プロバイダーの実行時に参照できていないためにこのようなエラーとなる。存在するパスを、型プロバイダーの探索対象にあらかじめ登録しておく必要がある。クラスのRegisterProbingFolderメソッドでこれを解決できる。このように実装することで、型プロバイダーと同じパスに存在するDLLが実行時に参照可能となる。他のNuGetパッケージに依存した型プロバイダーを作ってNuGetで配布するときのやり方FsBulletML.TypeProvidersは、FsBulletML.CoreおよびFsBulletML.ParserのNuGetパッケージに依存するかたちで配布したい。この場合、他のNuGetパッケージが展開されるフォルダのパスを考慮した実装が必要となる。良さそうな方法は、package.configのXMLを読み込んで参照するパスを解決する方法が考えられる。FsBulletML.TypeProvidersでは、下記のような感じで、型プロバイダーが依存するNuGetパッケージのパスを探索するよう実装することでこれを解決した。いうことで、FsBulletML.TypeProvidersリリースしました。言語サービスがそのプロバイダーを無効化するようにシグナルを通知することができる。Studio上でホストされている場合に限り、再度型チェックが行われる。これを利用して型プロバイダーが参照するファイルの更新チェックを実装することができる。(F#)のInvalidateメソッドを呼び出すように実装すればよい。FsBulletML.TypeProvidersでも実装しています。ソースはここにあります。最後に、@bleisさんのTypeProviderについて、勝手に補足で紹介されていた生成型の型プロバイダーのひじょーにシンプルな例についてご紹介。消去型のサンプル型が消えてますね。ILDASMで逆コンパイルした結果も見てみましょう。型が消去されています。これを生成型の型プロバイダーに書き直してみます。falseとすること。ProvidedAssemblyで一時アセンブリを作り、そのアセンブリにAddTypesで生成する型を登録することです。この例では、アセンブリ内に定義したPiyoクラスを継承する型を生成しています。ILDASMで逆コンパイルした結果を見てみましょう。Studio上でも確認ができたように、型が消去されずに、Piyoクラスを継承したHogeAクラスが型プロバイダーによって生成されていることが確認できます。30うほ!とても面白いアイデア。生成型の型プロバイダーだと確かにそういった構想の面白いブツが作れそうですね(wktk)。Provider)のちょっとしたアレコレを書いてみました。Toolsなのか他の拡張機能なのかわからないけど、型プロバイダーを書いたりデバッグしていると、割と頻繁になにかしらの拡張機能のエラーのダイアログがでてきてウザいですよ(激おこ)。参加し...2011-03-08Observableコンピューテーション式はモナド則を満たしているか否か。前回のエントリ「F#でRxる。訓練されたF#erはコンピューテ...2010-12-24メモ〜化したりスマス。Functio...のぶひささん(id:Nobuhisa)が、魔法的メモ化関数を書いてくださ...2010-08-09いわゆる遅延リストとか遅延ストリーム。月別アーカイブ参加グループプログラミング。