2011-08-27 2 views
12

템플릿 하스켈을 배우려고합니다. 연습으로, 나는 isLeftisRight (영감을 받아 this question)과 같은 것을 생성 할 수있는 함수를 작성했습니다.

isA connam = do 
    ConE nam <- connam 
    nn <- newName "p" 
    lamE [varP nn] $ caseE (varE nn) [ 
         match (conP nam [wildP]) (normalB [| True |]) [], 
         match wildP (normalB [| False |]) [] 
        ] 

문제는 내가 대신 isA Left 더 직관적의 $(isA [| Left |])를 작성해야한다는 것입니다 : 여기 내 겸손 시도합니다. 추한 구문을 없앨 수 있습니까? 설명서에서 대답을 찾을 수없는 것 같습니다.

이 함수는 인수가 하나 인 생성자에서만 작동하지만, 이는 another question입니다.

답변

10

이유가 있기 때문에 구문이 있습니다. 여기에 컴파일 시간의 마술이 있다는 것을 독자에게 알리기 위해. 스플 라이스가 최상위에있을 때만 $(...)을 제거 할 수 있습니다.

그러나, 우리는 [| ... |]을 제거 할 수 있으며, 형태 보증 된 코드 더 Name 대신 Exp의 복용에 의해합니다

isA nam = do 
    nn <- newName "p" 
    lamE [varP nn] $ caseE (varE nn) [ 
         match (conP nam [wildP]) (normalB [| True |]) [], 
         match wildP (normalB [| False |]) [] 
        ] 

이를 사용하려면, 당신은이다 $(isA 'Left)을 써서 눈이 좀 쉬워.

보너스로 Name 이외의 값을 지정하려고하면 반박 할 수없는 패턴 일치 오류 대신 형식 오류가 발생합니다.

은 참조 : Template Haskell Syntax

+0

감사합니다. 나는 확실히 그것으로 살 수있다. 어딘가에서'$'는 스플 라이스에 더 이상 필요하지 않다는 것을 기억하지만, 어떤 컨텍스트 였는지 또는 여기에 적용 할 수 있는지 여부는 확실하지 않습니다. –

+0

@ n.m. 나는 방금 전에 나의 대답에 그것을 추가했다 :) 나는 당신이 당신의 코멘트를 쓰는 동안 나의 원래 대답을 아직도보고 있었다고 생각한다. – hammar

+0

아하, 그래서'isA 'Left'가 실제 함수 대신에 isALeft라는 함수의 선언을 생성하고자한다면 $를 생략 할 수 있습니까? –

관련 문제