템플릿 haskell 문에서 출력을 쉽게 볼 수있는 방법은 무엇입니까?
-
12-09-2019 - |
문제
내 모듈에는 다음 템플릿 haskell 코드가 있으며 더 큰 응용 프로그램의 일부입니다.
$(derive makeFoldable ''JStatement)
접이식의 생성 인스턴스가 원래 생각했던 것과 정확히 일치하지는 않지만 이것을 확인할 방법을 찾을 수는 없습니다. 따라서, 유리하게 사용합니다 ghci
, 생성 된 인스턴스를 볼 수 있습니까?
나는 다음을 시도하고 구문 오류를 받았는데 이것이 틀린 ™를하고 있기 때문이라고 생각합니다.
> derive makeFoldable ''JStatement
<interactive>:1:21:
lexical error in string/character literal at character '\''
해결책
나는 그것을 알아. 당신이 지나가는 경우 -ddump-splices
모듈을 컴파일 할 때 생성 된 인스턴스를 터미널에 인쇄합니다.
다른 팁
GHCI 보고서 "lexical error...
"GHCI 세션에서 템플릿 Haskell이 활성화되어 있지 않기 때문에 통과하여 활성화 할 수 있습니다. -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의 답변)GHCI 자체에서 생성 된 Haskell 코드를 Pretty 인쇄합니다.
> 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
운영. 여기에는 파생 패키지의 일부 (또는 아마도 대부분?) 도출이 포함됩니다.
제휴하지 않습니다 StackOverflow