2011-08-27 8 views
12

Sto cercando di imparare Template Haskell. Come esercizio, ho scritto una funzione che può generare cose come isLeft e isRight (ispirato a this question). Qui è il mio umile tentativo:

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

Il problema è che devo scrivere $(isA [| Left |]) al posto del più intuitivo isA Left. È possibile sbarazzarsi della brutta sintassi? Non riesco a trovare la risposta nella documentazione.

La funzione funziona solo con costruttori a un argomento, ma questo è per another question.

risposta

10

La sintassi è lì per un motivo; per informare il lettore che qui è in corso una magia in fase di compilazione. Puoi eliminare lo $(...) solo quando la giuntura è al livello più alto.

Tuttavia, siamo in grado di eliminare il [| ... |] e anche rendere il codice più type-safe prendendo in una Name invece di un Exp:

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

Per utilizzare questo, devi scrivere $(isA 'Left), che è un un po 'più facile per gli occhi

Come bonus, se si prova a dare qualcosa di diverso da uno Name, si ottiene un errore di tipo invece di un errore di corrispondenza del modello irrefutabile.

Vedere anche: Template Haskell Syntax

+0

Grazie. Posso sicuramente conviverci. Ricordo di aver letto da qualche parte che "$" non è più necessario per le giunzioni, ma non sono sicuro di quale contesto fosse, o se possa applicarsi qui. –

+0

@ n.m. L'ho appena aggiunto alla mia risposta un attimo fa :) Immagino che stavi ancora visualizzando la mia risposta originale mentre scrivevo il tuo commento. – hammar

+0

aha, quindi se voglio 'isA 'Left' per generare una dichiarazione di una funzione chiamata' isALeft' invece della funzione effettiva, posso omettere $, giusto? –

Problemi correlati