2011-08-27 5 views
12

Estoy tratando de aprender algo de Template Haskell. Como ejercicio, escribí una función que puede generar cosas como isLeft y isRight (inspirada en this question). Aquí es mi humilde intento:

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

El problema es que tengo que escribir $(isA [| Left |]) en lugar de la más intuitiva isA Left. ¿Es posible deshacerse de la sintaxis fea? Parece que no puedo encontrar la respuesta en la documentación.

La función solo funciona con constructores de un argumento, pero esto es para another question.

Respuesta

10

La sintaxis está ahí por una razón; para informar al lector que hay magia en tiempo de compilación aquí. Solo puede eliminar el $(...) cuando su empalme esté en el nivel superior.

Sin embargo, podemos eliminar la [| ... |] y también hacer que el código sea más de tipo seguro, tomando en un Name en lugar de un Exp:

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

Para utilizar esto, se escribiría $(isA 'Left), que es una poco más fácil para los ojos.

Como beneficio adicional, si intenta darle algo distinto de Name, obtendrá un error de tipo en lugar de un error irrecuperable de coincidencia de patrón.

Véase también: Template Haskell Syntax

+0

Thanks. Definitivamente puedo vivir con eso. Recuerdo leer en alguna parte que '$' ya no es necesario para los empalmes, pero no estoy seguro de en qué contexto se trataba, o si se puede aplicar aquí. –

+0

@ n.m. Acabo de añadir eso a mi respuesta hace un momento :) Supongo que todavía estabas viendo mi respuesta original mientras escribía tu comentario. – hammar

+0

aha, así que si quiero 'isA 'Left' para generar una declaración de una función llamada' isALeft' en lugar de la función real, puedo omitir $, ¿verdad? –

Cuestiones relacionadas