2012-06-08 1 views
4

Я пытаюсь создать простую консоль ghci-like, используя ghc-api. Я дошел до точки, где я могу извлечь выражения Type, используя exprType и оценить их. Есть ли еще простой способ проверить, имеет ли тип выражения экземпляр данного класса?Ограничения класса GHC-api и typechecking

Редактировать: Кажется, что функции, которые я ищу, потребуют 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) для класса, то вы передать типы для проверки класса (требуется более одного, если класс является классом типа multiparam). Затем он вернет True или False в Q-монаде.

+0

Это многообещающе, но я также не могу придумать способ запуска Q монады в монаде GHC. – aleator

Смежные вопросы