4
我想用ghc-api構建一個簡單的ghci-like控制檯。我已經到了可以使用exprType
提取Type
的表達式並評估它們的點。是否還有一種簡單的方法來檢查表達式的類型是否具有給定類的實例?GHC-api和類型檢查類限制
編輯:看來我正在尋找的功能將需要InstEnv
,但我不知道在哪裏可以找到。
我想用ghc-api構建一個簡單的ghci-like控制檯。我已經到了可以使用exprType
提取Type
的表達式並評估它們的點。是否還有一種簡單的方法來檢查表達式的類型是否具有給定類的實例?GHC-api和類型檢查類限制
編輯:看來我正在尋找的功能將需要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"
它的類型的簽名是
isInstance :: Name -> [Type] -> Q Bool
即你得到(使用''
或與mkName
功能檢索)的類的名稱,然後你通過類型檢查該類(如果該類是多參數類型類,則需要多個類)。然後它會在Q monad中返回True或False。
這是有希望的,但我不能想到在GHC monad中運行Q monad的方法。 – aleator