2010-06-04 7 views
5

Dans le code:Qu'est-ce qui est passé?

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 n'est pas passé à oneChar. D'où vient-il?

Répondre

5

lookup c simpleEscapes renvoie une valeur Maybe String, qui peut être Nothing ou Just <a string>. r est la chaîne contenue dans le Just, tel que défini par la ligne:

Just r -> text r 
1

Vous utilisez une déclaration de cas sur la valeur retournée par recherche c simpleEscapes, qui est de type Peut-être. Peut-être a deux constructeurs de données: Just and Nothing. Le constructeur de données Just est paramétré par une valeur, le constructeur Nothing data n'a pas de paramètres. Donc, dans ce cas, r est le paramètre formel du constructeur de données Just: c'est la valeur réelle dans la valeur retournée par la recherche.

2

Si vous vous demandez où l'identifiant est introduit, il est lié par la déclaration dans la case correspondance de motif , de la même manière l'identifiant c est lié par la correspondance de motif dans la définition de la fonction.

Toute correspondance de motif peut introduire un nouvel identifiant pour l'expression associée:

(\(Just x) -> x) foo 

let (Just x) = foo in x 

f (Just x) = x 

case foo of 
    Just x -> x 

... tous ceux qui mettent en place un nouvel identifiant nommé x. En fait, ils sont tous à peu près équivalents, car le compilateur les convertit tous en blocs case sous le capot.

3

Le mot-clé case introduit une correspondance de motif, qui a la forme case EXPR of (PATTERN -> EXPR)+. Donc, Just r est un modèle, qui correspond au résultat de lookup c simpleEscapes of. Dans un modèle, les variables peuvent être liées. Fondamentalement, cela signifie que si lookup c simpleEscapes of renvoie Just, alors r sera lié à la valeur à l'intérieur de Just et le résultat de l'expression sera text r.

Questions connexes