Ответ 1
Я понял это. Если вы пройдете -ddump-splices
, он будет печатать созданные экземпляры на терминал при компиляции модуля.
У меня есть следующий код шаблона 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
(как уже указывалось в Deniz Dogan answer)
Достаточно распечатать сгенерированный код 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
.
Это включает некоторые (или, может быть, большинство?) Деривации производного пакета.