단일 TH 기능을 가지고 유형을 정의하고 유형을 사용하는 방법이 있습니까? 아래 관련 코드. PersonPoly2
은 makeRecordSplice
에 의해 정의 된 후 TH 함수이기도 한 makeAdaptorAndInstance
(Opalaye에서)으로 전달됩니다.TemplateHaskell 함수에서 유형을 정의하고 같은 함수에서 사용하는 방법은 무엇입니까?
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Lib where
import Data.Profunctor.Product.TH (makeAdaptorAndInstance)
import Language.Haskell.TH
makeRecordSplice :: Q [Dec]
makeRecordSplice = [d|
data PersonPoly2 a b = Person2
{ id :: a
, name :: b
}
|]
makeRecordAndAdapter :: Q [Dec]
makeRecordAndAdapter = do
record <- makeRecordSplice
adapter <- makeAdaptorAndInstance "pPerson2" (mkName "PersonPoly2")
return $ record ++ adapter
-------------
/home/Projects/scratch/app/Main.hs:26:1: error:
‘PersonPoly2’ is not in scope at a reify
Failed, modules loaded: Lib.
O.P.는 모나드 내부에서 TH 함수를 호출하려고 시도하고있었습니다. 그건 잘못되었습니다 : TH는 프로그램의 최상위 레벨에 나타나야하는 선언을 작성하고 있습니다. 그래서 당신의 대답은 정확하게 스플 라이스를 최상위에 두는 것입니다. – AntC