2012-01-01 11 views
3

私はそのようなテンプレートHaskellの関数を作成したいと思います:SomeTypeはそうRead、およびFalseのインスタンスである場合Haskell:型がクラスのインスタンスかどうかを調べるには?

$(isInstanceOf ''Read ''SomeType) 

Trueのいずれかになります。

reifyの結果を調べようとしましたが、ClassIコンストラクタの内容を探していますが、ドキュメントが多少不足していて、必要なものを解読できません。誰かが、上記の機能を作成するために必要なデータを見つけるための場所を教えてくれますか?

答えて

3

テンプレートハスケルはすでにa functionを提供しています。ほとんどあなたが望むものを提供しています。そこにはバージョン2.5のものがあります。それ以前は、インスタンスを検索する手段がないことに気づいていません。あなたが持つインスタンスを探すためにType - しかし''Readのようなものから得るものである -

違いは、既存のisClassInstance関数がクラスのNameを取ることです。 Nameでは、タイプパラメータを必要とするインスタンスを確認する明白な方法がないため、これはおそらくもっと意味があります。たとえば、[Int]Showインスタンスがあるか、Either StringMonadインスタンスかどうかを直接確認することはできません。

Typeは、引用符を使用してNameとほぼ同じくらい簡単に構成できます。 $(isInstanceOf ''Monad [t| Either String |])のようなものを書くことができます。

上記を踏まえれば、スプライスから有用な価値を返すために、あなたがしたいことが何であれ、ジャグリングをするだけです。

関連する問題