Как я могу легко просмотреть выходные данные оператора Template Haskell?
-
12-09-2019 - |
Вопрос
В моем модуле есть следующий код шаблона Haskell, который является частью более крупного приложения.
$(derive makeFoldable ''JStatement)
Я подозреваю, что сгенерированный экземпляр Foldable — это не совсем то, что я изначально имел в виду, но не могу найти способ это проверить.Поэтому предпочтительно использовать только ghci
, можно ли просмотреть сгенерированный экземпляр?
Я попробовал следующее и получил синтаксическую ошибку. Я предполагаю, что это потому, что я делаю это неправильно™.
> derive makeFoldable ''JStatement
<interactive>:1:21:
lexical error in string/character literal at character '\''
Решение
Я понял.Если ты пройдешь -ddump-splices
он будет печатать сгенерированные экземпляры на терминале при компиляции модуля.
Другие советы
Об этом сообщает GHCi»lexical error...
«Потому что у вас нет шаблона Haskell, активированного в вашем сеансе GHCI.Вы можете активировать его либо, пройдя -XTemplateHaskell
На командной строке или из самого GHCI:
ghci> :set -XTemplateHaskell
После исправления вы должны получить сообщение об ошибке следующего вида:
No instance for (Show DecsQ) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it
Теперь у вас есть несколько вариантов печати вещей, которые находятся внутри Q
монада:
Использовать
-ddump-splices
(как уже указывалось в Ответ Дениз Догана)Довольно распечатайте сгенерированный код Haskell из самого GHCi:
> putStrLn $(stringE . pprint =<< derive makeFoldable ''JStatement) instance Foldable (JStatement ...) where foldr ... = ...
Покажите фактическую структуру на основе конструкторов:
> putStrLn $(stringE . show =<< derive makeFoldable ''JStatement) [InstanceD [] (AppT (ConT Foldable) (... JStatement ...)) [...]]
Последние два можно упростить, используя runQ
, но это не работает для генерации кода, которая использует некоторые шаблоны функций Haskell, таких как reify
операции.Сюда входят некоторые (или, может быть, большинство?) производные пакета.