TypeProviderでコンピュテーション式用の型を生成してみた #FsAdvent
この記事はF# Advent Calendar 2015の25日目の記事です。
TypeProviderを使う
今までチュートリアルくらいしかTypeProviderは作ったことはなかったのですが、ようやく重い腰をあげて使うことにしました。
型プロバイダー(TypeProvider)のちょっとしたアレコレ - Bug Catharsis
ぜくるお兄さんの記事、とても参考になるので何回も読み直してます。
コンピュテーション式とTypeProvider
コンピュテーション式のビルダーは単なる型なので、TypeProviderの対象にできますね?
というわけで今回は、以下のことをやってみようということに。
MonadBuilderTypeProvider構想
— ふ''れいす (@bleis) 2014, 7月 30
モジュール名を渡すと、そのモジュールにbindやらreturnやらが定義されていた場合にそれを引っ張ってきてビルダークラスを作るようなTypeProvider
— ふ''れいす (@bleis) 2014, 7月 30
これ一年半くらい前の発言なのですね…。
結論
できなくはないけど、できることが限られていてつらいorz
このリポジトリのコードを読んでいただけるとわかると思うのですが、Generic MethodがTypeProviderで生成できない関係で単一の型でしかbindできなかったり、その関係でdo!
が使えなかったりと、少なくともMonadTypeProviderみたいな汎用的なものは厳しい印象です。
逆に考えると、ジェネリックさえからませなければわりとやりたい放題できるということがわかったので、なんか色々と模索したいところです。
当分はカスタムオペレータの方向で模索してみます。