문제

내 모듈에는 다음 템플릿 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 운영. 여기에는 파생 패키지의 일부 (또는 아마도 대부분?) 도출이 포함됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top