2010-11-15 12 views
12

Spesso sento la frase, le guardie sono solo zucchero sintattico per if-then-else (o dichiarazioni di un caso).guardia desugaring

Può per favore qualcuno desugar il seguente esempio:

halfOf :: Int -> Int 
halfOf x | even x = div x 2 

(la funzione è volutamente parziale)

Grazie,

risposta

3

La semantica di pattern matching sono definite nella seguente sezione della norma: Formal Semantics of Pattern Matching.

Il passaggio pertinente alla domanda è c. Come si può vedere, modello corrisponde con le guardie della forma

case v of { p | g1 -> e1 ; ... 
       | gn -> en where { decls } 
      _  -> e' } 

sono convertiti al modello corrisponde senza protezioni come:

case e' of 
{y -> 
    case v of { 
     p -> let { decls } in 
      if g1 then e1 ... else if gn then en else y ; 
     _ -> y }} 

Così guardie del modello sono definiti in termini di if e "falltrough" è implementato legando l'espressione a una variabile e quindi ripetendola una volta nella clausola else dello if e quindi nel modello a cui si farebbe riferimento.

Se non c'è nessun caso a cadere fino al (come nel tuo esempio) si saranno stati inseriti dopo passo b, che inserisce un caso di default _ -> error "No match"

+0

Grazie per il riferimento. Mi piacerebbe essere in grado di contrassegnare un ramo come errore di corrispondenza del modello, ma posso capire perché tale funzionalità non è offerta dalla lingua. Grazie! – Ozgur

12
halfOf x = 
    if even x 
    then div x 2 
    else error "Incomplete pattern match" 

Il tipo esatto di errore provocato da un caso non gestita è non specificato dalla definizione del linguaggio e varia dal compilatore al compilatore.

: Se ci sono più guardie e/o schemi, ogni guardia o corrispondenza di modello va nella parte non corrispondente del caso precedente.

compare x y 
    | x == y = foo 
    | x /= y = bar 
compare _ _ = baz 

produce

compare x y = 
    if x == y 
    then foo 
    else if x /= y 
     then bar 
     else baz 
+0

yaha! c'è un problema qui. questo non è un errore di corrispondenza del modello. cosa succede se c'è un altro caso dopo questa linea? – Ozgur

+2

@ Ozgur: Se vuoi una risposta completa non provare ad esporre le persone con domande intenzionalmente errate. – Akusete

+0

@Ozgur: vedere http://cs.anu.edu.au/Student/comp1100/haskell/tourofsyntax.html#Guards – Akusete

Problemi correlati