【发布时间】:2012-06-12 15:52:24
【问题描述】:
我正在尝试使用 ghc-api 构建一个简单的类似 ghci 的控制台。我已经到了可以使用exprType 提取Type 的表达式并评估它们的地步。还有一种简单的方法可以检查表达式的类型是否具有给定类的实例?
编辑:我正在寻找的功能似乎需要InstEnv,但我不知道在哪里可以找到它。
【问题讨论】:
我正在尝试使用 ghc-api 构建一个简单的类似 ghci 的控制台。我已经到了可以使用exprType 提取Type 的表达式并评估它们的地步。还有一种简单的方法可以检查表达式的类型是否具有给定类的实例?
编辑:我正在寻找的功能似乎需要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 函数检索),然后传递类型以检查类(如果类是多参数类型,则需要多个类型班级)。然后它将在 Q monad 中返回 True 或 False。
【讨论】: