그냥 하스켈 템플릿을 배우기 시작하고 스플 라이스와 관련된 간단한 문제에 매달 렸습니다. 내가 가지고있는 메인 모듈에서
템플릿 문제 Haskell 무대 제한
tupleN :: Lift a => a -> Int -> Q Exp
tupleN a n = do
(TupE as) <- lift a
return $ as !! n
:
모듈 하나에서 나는 튜플의 N 번째 요소를 응답 기능 tupleN
을 구현했습니다
main :: IO()
main = do
let tup = (1::Int,'a',"hello")
putStrLn $ show $(tupleN $tup 1)
, 하지만 그렇지 않을 것입니다. 컴파일러 인쇄 오류 :
main :: IO()
main = do
putStrLn $ show $(tupleN (1::Int,'a',"hello") 1)
내가 처음 변종없는 무엇 : 바로 접합 식으로 튜플 설명을 넣으면
GHC stage restriction: `tup'
is used in a top-level splice or annotation,
and must be imported, not defined locally
In the expression: tup
In the first argument of `tupleN', namely `$tup'
In the expression: tupleN ($tup) 1
, 코드 작업이 될?
템플릿, 런타임하지 : 당신은, 그러나, 크기
sz
의 튜플의i
일 요소를 얻을 수있는 기능으로 확장 스플 라이스를 정의 할 수 있습니다. 스플 라이스는 컴파일 할 때 실행할 수 있어야합니다. –@LouisWasserman 나는이 규칙에 대해 안다 : 나는 단지'tup' 변수를 스플 라이스 표현식에 넣기를 원한다. 'tup'의 타입에 대한 정보는 컴파일시에 사용 가능합니다. 그래서 여기에 캡쳐 될 수 있습니다. –