2011-08-27 14 views
12

Próbuję nauczyć się jakiegoś szablonu Haskella. Jako ćwiczenie napisałem funkcję, która może generować rzeczy takie jak isLeft i isRight (inspirowane przez this question). Oto moja skromna próba:

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 |]) [] 
        ] 

Problemem jest to, że muszę napisać $(isA [| Left |]) zamiast bardziej intuicyjny isA Left. Czy można pozbyć się brzydkiej składni? Nie mogę znaleźć odpowiedzi w dokumentacji.

Funkcja działa tylko z jednoargumentowymi konstruktorami, ale jest to dla another question.

Odpowiedz

10

Składnia jest tam z jakiegoś powodu; aby poinformować czytelnika, że ​​dzieje się tu magia kompilacji. Możesz wyeliminować tylko $(...), gdy twoje splicowanie jest na najwyższym poziomie.

Jednak możemy wyeliminować [| ... |] a także uczynić kod bardziej bezpieczne typu przez biorąc w Name zamiast Exp:

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

Aby to wykorzystać, by napisać $(isA 'Left), który jest trochę łatwiej w oczach.

Jako bonus, jeśli spróbujesz podać mu coś innego niż Name, otrzymasz błąd typu zamiast niezaprzeczalnego błędu dopasowania wzoru.

Zobacz także: Template Haskell Syntax

+0

Dzięki. Z pewnością mogę z tym żyć. Pamiętam, że przeczytałem gdzieś, że '$' nie jest już potrzebne do splotów, ale nie jestem pewien, w jakim kontekście był, ani czy może się tutaj zastosować. –

+0

@ n.m. Właśnie dodałem to do mojej odpowiedzi przed chwilą :) Sądzę, że wciąż przeglądałeś moją oryginalną odpowiedź podczas pisania twojego komentarza. – hammar

+0

aha, więc jeśli chcę, aby 'isA 'Left' wygenerował deklarację funkcji o nazwie' isALeft' zamiast rzeczywistej funkcji, mogę pominąć $, prawda? –

Powiązane problemy