2012-06-08 37 views
4

我想用ghc-api構建一個簡單的ghci-like控制檯。我已經到了可以使用exprType提取Type的表達式並評估它們的點。是否還有一種簡單的方法來檢查表達式的類型是否具有給定類的實例?GHC-api和類型檢查類限制

編輯:看來我正在尋找的功能將需要InstEnv,但我不知道在哪裏可以找到。

回答

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" 

它的類型的簽名是

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

即你得到(使用''或與mkName功能檢索)的類的名稱,然後你通過類型檢查該類(如果該類是多參數類型類,則需要多個類)。然後它會在Q monad中返回True或False。

+0

這是有希望的,但我不能想到在GHC monad中運行Q monad的方法。 – aleator