2010-11-15 12 views
12

A menudo escucho la frase, los guardias son solo azúcar sintáctica para if-then-else (o declaraciones de casos).guard desugaring

¿Puede alguien por favor desugar el siguiente ejemplo:

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

(La función es intencionadamente parcial)

Gracias,

Respuesta

3

La semántica de coincidencia de patrones se definen en la siguiente sección de la norma: Formal Semantics of Pattern Matching.

El paso que es relevante para su pregunta es c. Como se puede ver, patrón coincide con los guardias de la forma

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

se convierten a patrón coincide con y sin guardias como:

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

Así guardias de patrón se definen en términos de if y "fallthrough" se implementa vinculando la expresión a una variable y luego repitiéndola una vez en la cláusula else del if y luego en el patrón al que te vas a referir.

Si no hay ningún caso a caer a través de (como en el ejemplo) uno se habrá insertado por el paso b, que inserta un caso por defecto _ -> error "No match"

+0

Gracias por la referencia. Me encantaría poder marcar una rama como error de coincidencia de patrón, pero puedo ver por qué el lenguaje no ofrece esa funcionalidad. ¡Gracias! – Ozgur

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

El tipo exacto de error provocado por un caso no controlada es no especificado por la definición de idioma, y ​​varía de compilador a compilador.

edit: Si hay múltiples protecciones y/o patrones, cada protección o coincidencia de patrón entra en la parte no coincidente del caso anterior.

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! hay un problema aquí este no es un error de coincidencia de patrón. ¿Qué pasa si hay otro caso después de esta línea? – Ozgur

+2

@Ozgur: si quiere una respuesta completa, no intente engañar a las personas con preguntas mal redactadas intencionalmente. – Akusete

+0

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

Cuestiones relacionadas