2015-01-11 2 views
4

NameG 생성자에 대한 작은 따옴표 구문을 항상 사용할 수 있습니까? 예 : Template Haskell 이름을 desugar 'x를 NameG로 인용 하시겠습니까?

'x 

은 항상 옳다,

(Name (OccName "x") (NameG VarName (PkgName "some-package") (ModName "SomeModule"))) 

에 하스켈 후 실행 단계 템플릿입니다 이름 확인 후 항상이 있어야이 정보를, desugar는 무엇입니까? 그리고 나는 최상위 이름을 인용하는 것에 만 관심이 있지만, 지역 이름을 인용 할 수 없었다.

컨텍스트 : 고유 식별자를 반환하는 함수를 작성하고 싶습니다. Template Haskell은 출력을 불확실성으로 감싸고 싶지 않지만 입력을 제한 할 수 없기 때문에 부분 함수입니다. '을 사용하면 준 인용 부호 또는 접합 문자를 사용하고 싶지 않습니다.

(<=>) :: Name -> a -> Named a 
:

name (Name occ (NameG _ pkg mod)) = Unique occ pkg mod 

내가 같은 기능을 갖고 싶어 : 나는 주어진, 동일한 모듈에서, 위와 같이 인용 최상위 이름을 사용하는 경우이 부분 함수가 런타임에 안전하다는 것을 증명하려면

주어진 :

:

data Named a = Named a Unique 

변수 바인딩을 주석 컴파일시에 접합을 무거운 스플 라이스 구문 $(name ...)을 사용하고 호출 할 필요가 사용자없이3210

x = 'x 
<=> ... 

:

x = $(name 'x) 
<=> ... 

사용자는 구성을 위해, 많은 이들의를 작성합니다.

https://downloads.haskell.org/~ghc/7.8.3/docs/html/users_guide/template-haskell.htmlhttps://hackage.haskell.org/package/template-haskell-2.8.0.0/docs/src/Language-Haskell-TH-Syntax.html#Name은 말하지 않았습니다.

(p.s. 또한 동일한 것으로 예상 되긴하지만 이중 따옴표 구문 (예 : ''T)에 유사한 보증이 있는지 알고 싶습니다.) '인용 이름이 컴파일 타임에 알려져 있기 때문에

+1

'$ (stringE $ Data.Generics.gshow'x)의 let x =()는''(NameL (1627422417)))'' – aavogt

답변

1

, 왜 당신은 Q 모나드에로 이름을 변경하지 마십시오

name :: Name -> ExpQ 
name (Name occ (NameG _ pkg mod)) = [| Unique occ pkg mod |] 
name n = fail $ "invalid name: "++ gshow n 

은 그럼 당신은 $(name 'show) :: Unique 대신 name 'show :: Unique 사용합니다. 유효하지 않은 Name (누군가가 mkName을 사용한다고 가정하면)이 오류는 컴파일 타임에 표시됩니다.

+0

네, 내 계획 B, 더 안전하지만 추악한 (그리고 아마도 컴파일 시간이 더 느리다). 나는 그 질문을 편집했다. –