4

次のようなテンプレートHaskell関数を作成したいと思います。

$(isInstanceOf ''Read ''SomeType)

がのインスタンスであるTrue場合は、のいずれかになり、それ以外の場合は結果になります。SomeTypeReadFalse

の結果を見てみたところreify、コンストラクターの内容を探していると思いますClassIが、ドキュメンテーションがやや不足していて、必要なものを解読するのに苦労しています。上記の関数を作成するために必要なデータを見つけるためにどこを探すべきかについて誰かがガイダンスを提供できますか?

4

1 に答える 1

3

テンプレート Haskell は、あなたが望むほとんどの機能をすでに提供しています。それはバージョン 2.5 の時点であり、それ以前はインスタンスを検索する手段をまったく知りませんでした。

違いは、既存のisClassInstance関数がNameクラスに a を使用することです。これは、インスタンスを探す''Readのに a のようなものから得られるものです。型パラメーターを必要とするインスタンスをチェックする明確な方法がないTypeため、これはおそらくより理にかなっています。Nameたとえば、インスタンスがあるかどうか、またはインスタンスであるかどうか[Int]を直接確認することはできません。ShowEither StringMonad

Typea は、引用符を使用するのとほぼ同じくらい簡単に構築できることに注意してください。Nameたとえば、 のように書くことができます$(isInstanceOf ''Monad [t| Either String |])

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

于 2012-01-11T22:57:22.203 に答える