4

ghc-api を使用して、単純な ghci のようなコンソールを構築しようとしています。Typeを使用して の式を抽出exprTypeし、それらを評価できるようになりました。式の型が特定のクラスのインスタンスを持っているかどうかを確認する簡単な方法はありますか?

編集:私が探している関数には が必要なようですがInstEnv、それを見つける場所がわかりません。

4

1 に答える 1

3

メソッドは、isInstance必要なことを行う場合があります。

ghci での例:

> :set -XTemplateHaskell
> import Language.Haskell.TH
> $(stringE . show =<< (isInstance ''Functor . (: []) =<< [t| [] |]))
"True"
> $(stringE . show =<< (isInstance ''Show . (: []) =<< [t| Maybe Int |]))
"True"
$(stringE . show =<< (isInstance ''Show . (: []) =<< [t| (Int -> Bool) |]))
"False"

そのタイプ sig は

isInstance :: Name -> [Type] -> Q Bool

''つまり、クラスの名前 (または関数を使用して取得mkName) を指定し、そのクラスに対してチェックする型を渡します (クラスが multiparam 型クラスの場合は、複数の型が必要になります)。その後、Q モナドで True または False を返します。

于 2012-06-09T01:42:33.903 に答える