我正在尝试使用ghc-api构建一个简单的类似ghci的控制台。我已经到了可以使用Type
提取exprType
表达式并评估它们的地步。是否还有一种简单的方法来检查表达式的类型是否具有给定类的实例?
编辑:似乎我正在寻找的功能需要InstEnv
,但我不知道在哪里可以找到它。
答案 0 :(得分: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
函数检索),然后传递类型以检查该类(如果该类将需要多个类型)是一个多参数类型)。然后它会在Q monad中返回True或False。