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

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

$(derive makeFoldable ''JStatement)

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

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

> derive makeFoldable ''JStatement

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

person Deniz Dogan    schedule 19.04.2009    source источник


Ответы (2)


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

person Deniz Dogan    schedule 19.04.2009

GHCi сообщает «lexical error...», потому что у вас не активирован Template 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, но это не работает для генерации кода, использующего некоторые функции Template Haskell, такие как операции reify. Это включает в себя некоторые (или, может быть, большинство?) производных пакетов.

person Rudy Matela    schedule 14.12.2015
comment
Ваш ответ подсказал мне, что вы можете сделать :set -XTemplateHaskell, а затем :set -ddump-splices в сеансе ghci. Не имел представления. - person liminalisht; 17.03.2016