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

StackOverflow https://stackoverflow.com/questions/765902

Вопрос

В моем модуле есть следующий код шаблона 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 операции.Сюда входят некоторые (или, может быть, большинство?) производные пакета.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top