ghc-api を使用して、単純な ghci のようなコンソールを構築しようとしています。Type
を使用して の式を抽出exprType
し、それらを評価できるようになりました。式の型が特定のクラスのインスタンスを持っているかどうかを確認する簡単な方法はありますか?
編集:私が探している関数には が必要なようですがInstEnv
、それを見つける場所がわかりません。
メソッドは、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 を返します。