2010-06-04 17 views
5

En el código:¿Qué se está pasando?

oneChar :: Char -> Doc 
oneChar c = case lookup c simpleEscapes of 
       Just r -> text r 
       Nothing | mustEscape c -> hexEscape c 
         | otherwise -> char c 
    where mustEscape c = c < ' ' || c == '\x7f' || c > '\xff' 

simpleEscapes :: [(Char, String)] 
simpleEscapes = zipWith ch "\b\n\f\r\t\\\"/" "bnfrt\\\"/" 
    where ch a b = (a, ['\\',b]) 

r no se está pasando a oneChar. ¿De dónde viene?

Respuesta

5

lookup c simpleEscapes devuelve un valor de Maybe String, que puede ser Nothing o Just <a string>. r es la cadena contenida en el Just, según lo definido por la línea:

Just r -> text r 
1

Estás usando una declaración de caso sobre el valor devuelto por las operaciones de búsqueda c simpleEscapes, que es de tipo Tal vez. Tal vez tiene dos constructores de datos: Just and Nothing. El constructor de datos Just está parametrizado por un valor, el constructor de datos Nothing no tiene parámetros.

Entonces, en este caso, r es el parámetro formal para el constructor de datos Just: es el valor real en el valor devuelto de la búsqueda.

2

Si usted está pidiendo que se introduce el identificador, es obligado por el partido patrón en la declaración case, de la misma manera el identificador c está obligado por la coincidencia de patrones en la definición de función.

Cualquier coincidencia de patrón puede introducir un nuevo identificador para la expresión asociada:

(\(Just x) -> x) foo 

let (Just x) = foo in x 

f (Just x) = x 

case foo of 
    Just x -> x 

... todos los que introducen un nuevo identificador de llamada x. De hecho, todos son bastante equivalentes, porque el compilador los convierte todos en bloques de case bajo el capó.

3

La palabra clave del caso presenta una coincidencia de patrón, que tiene el formato case EXPR of (PATTERN -> EXPR)+. Entonces, Just r es un patrón que coincide con el resultado de lookup c simpleEscapes of. En un patrón, las variables pueden estar vinculadas. Básicamente, esto significa que si lookup c simpleEscapes of devuelve Just, entonces r se vinculará al valor dentro de ese Just y el resultado de la expresión será text r.

Cuestiones relacionadas