Как я могу легко увидеть вывод из шаблона Template Haskell? - PullRequest
10 голосов
/ 19 апреля 2009

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

$(derive makeFoldable ''JStatement)

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

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

> derive makeFoldable ''JStatement

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

Ответы [ 2 ]

11 голосов
/ 19 апреля 2009

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

1 голос
/ 15 декабря 2015

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

...