2011-09-27 4 views
11

링을 Z/n으로 만들려고합니다 (일반 산술과 같지만 일부 정수를 모듈로 만듭니다). 예를 들어 Z4 :템플릿의 데이터 생성자 haskell

instance Additive.C Z4 where 
    zero = Z4 0 
    (Z4 x) + (Z4 y) = Z4 $ (x + y) `mod` 4 

등이 있습니다. 나는이 것들을 빠르게 생성 할 수 있기를 원하며, 템플릿 haskell을 사용하는 방법이라고 생각한다. 이상적으로 나는 단지 $(makeZ 4)으로 가고 싶습니다. 그리고 위에 정의 된 것처럼 Z4 코드를 내뱉습니다.

그래도 문제가 많습니다. 내가 할 때 genData n = [d| data $n = $n Integer] "데이터/새 형식 선언에 구문 분석 오류"가 나타납니다. 그래도 변수를 사용하지 않으면 작동하지 않습니다 : [d| data Z5 = Z5 Integer |], 이는 내가 변수로 이상한 일을하고 있다는 것을 의미합니다. 그래도 나는 무엇이 확실하지 않다. 나는 newName을 통해 그것들을 생성하려고 시도했으나 그것도 작동하지 않았다.

여기에 무슨 일이 일어나는지 누군가가 도와 줄 수 있습니까?

+0

나는 템플릿 하스켈 마법사 아니지만, 나는 당신의 템플릿 하스켈 코드를보고 싶은 것입니다 사람들을 걸거야. –

답변

13

Template Haskell documentation에는 사용자가 연결할 수있는 항목이 나열되어 있습니다.

스플 라이스는

  • 식의 장소에서 발생할 수있다; 스플 라이스 된 표현식은 유형이 Q Exp
  • 이어야합니다. 스플 라이스 된 표현식은 유형이 Q Typ
  • 이어야합니다. 최상위 수준 선언 목록. 플라이 싱 표현하지만, 당신이 이름을 접합하기 위해 노력하고, 형에게 $n의 두 사건에서 Q [Dec]

이 있어야합니다.

이것은 인용 부호 및 스플 라이스를 사용하여 수행 할 수 없다는 것을 의미합니다. Language.Haskell.TH 모듈에서 사용할 수있는 다양한 조합을 사용하여 선언을 작성해야합니다.

저는 이것이 당신이하려는 일과 동등해야한다고 생각합니다.

genData :: Name -> Q [Dec] 
genData n = fmap (:[]) $ dataD (cxt []) n [] 
          [normalC n [strictType notStrict [t| Integer |]]] [] 

네, 조금 엉망 이군요. 이를 사용하려면 새 이름 (예 :

$(genData (mkName "Z5")) 
+0

사용 예를 포함시켜 주시겠습니까? 나는 당신이 약간 수정 한 후'$ (genData "Foo")'를 내 코드에 최상위 레벨로 던졌지만 ghci에서': Foo'를 실행하면 아무것도 찾지 못했습니다. – Xodarap

+1

@Xodarap :'mkName'을 사용하여'String'에서'Name'을 만듭니다. 예제를 추가했습니다. 나는 당신이'newName'을 사용했을지도 모른다고 생각합니다. 이름이 고유하다는 것을 보장하기 위해 마지막에 물건을 추가합니다. 그래서': info'는 그것을 보여주지 않을 것입니다. 당신은': browse'을 사용하여 그것을 볼 수 있어야합니다. – hammar

+0

고마워요! 이것은 정확하게 나의 문제이었다. – Xodarap