2009-04-19 6 views
10

큰 애플 리케이션의 일부인 내 모듈에 다음 템플릿 하스 켈 코드가 있습니다.Template Haskell 선언문의 출력을 쉽게 볼 수 있습니까?

$(derive makeFoldable ''JStatement) 

나는 접이식의 생성 된 인스턴스가 내가 원래 생각했던,하지만이를 확인하는 방법을 찾을 수 없습니다 정확히 아니라고 생각한다. 따라서 바람직하게는 ghci 만 사용하면 생성 된 인스턴스를 볼 수 있습니까?

나는 다음과 같은 시도를하고 구문 오류가있어 나는 이것이 잘못된 것 같기 때문에 이것을 추측하고있다.

> derive makeFoldable ''JStatement 

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

답변

11

알아 냈습니다. -ddump-splices을 전달하면 모듈을 컴파일 할 때 생성 된 인스턴스가 터미널에 인쇄됩니다.

1

GHCi 세션에서 Template Haskell 이 활성화되어 있지 않으므로 GHCi는 "lexical error..." 을보고합니다. 이제

No instance for (Show DecsQ) arising from a use of ‘print’ 
In a stmt of an interactive GHCi command: print it 

: 당신의 좋아하는에 오류가 발생해야한다는 고정 후

ghci> :set -XTemplateHaskell 

: 당신은 GHCi 자체 내에서 명령 줄 또는에서 -XTemplateHaskell를 통과하여 하나 을 활성화 할 수 있습니다 , Q 모나드 안에 여러 가지 옵션을 사용하여 을 인쇄 할 수 있습니다.

  • 사용 -ddump-splices (이미 Deniz Dogan's answer에서 지적한대로)

  • 예쁜 GHCi 자체에서 생성 하스켈 코드 인쇄 :

    > putStrLn $(stringE . pprint =<< derive makeFoldable ''JStatement) 
    instance Foldable (JStatement ...) 
        where foldr ... = ... 
    
  • 생성자에 따라 실제 구조를보기를 :

    > putStrLn $(stringE . show =<< derive makeFoldable ''JStatement) 
    [InstanceD [] (AppT (ConT Foldable) (... JStatement ...)) [...]] 
    

마지막 두 개는 runQ, 을 사용하여 단순화 될 수 있지만 은 템플릿 하스켈 함수 (예 : reify 작업)을 사용하는 코드 생성에는 작동하지 않습니다. 여기에는 파생 패키지의 일부 파생어 (또는 아마도?)가 포함됩니다.

+1

당신의 대답은 당신이 ghci 세션 내에서': set -XTemplateHaskell' 그리고': set -ddump-splices'를 할 수 있다는 사실을 알려주었습니다. 나는 몰랐다. – liminalisht