2009-04-19 2 views
10

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

$(derive makeFoldable ''JStatement) 

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

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

> derive makeFoldable ''JStatement 

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

ответ

11

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

1

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

+1

Ваш ответ подсказывал мне, что вы можете сделать ': set -XTemplateHaskell', а затем': set -ddump-splices' в сеансе ghci. Не имел представления. – liminalisht

Смежные вопросы