Как я могу легко увидеть вывод из инструкции Template Haskell?

У меня есть следующий код шаблона Haskell в моем модуле, который является частью более крупного приложения.

$(derive makeFoldable ''JStatement)

Я подозреваю, что сгенерированный экземпляр Foldable не совсем то, что я изначально имел в виду, но я не могу найти способ проверить это. Итак, предпочтительнее использовать только ghci, можно ли просмотреть сгенерированный экземпляр?

Я попробовал следующее и получил синтаксическую ошибку, и я предполагаю, что это потому, что я делаю это неправильно.

> derive makeFoldable ''JStatement

<interactive>:1:21:
    lexical error in string/character literal at character '\''

Ответ 1

Я понял это. Если вы пройдете -ddump-splices, он будет печатать созданные экземпляры на терминал при компиляции модуля.

Ответ 2

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. Это включает некоторые (или, может быть, большинство?) Деривации производного пакета.