2010-11-15 3 views
12

J'entends souvent l'expression, les gardes ne sont que du sucre syntaxique pour if-then-else (ou des déclarations de cas).guard desugaring

Quelqu'un peut-il s'il vous plaît desugar l'exemple suivant:

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

(La fonction est volontairement partielle)

Merci,

Répondre

3

La sémantique de correspondance de motif sont définies dans la section suivante de la norme: Formal Semantics of Pattern Matching.

L'étape qui correspond à votre question est c. Comme vous pouvez le voir, le motif correspond à des gardes de la forme

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

sont convertis à motif correspond sans gardes comme:

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

Ainsi, les gardiens de motif sont définis en termes de if et « fallthrough » est mis en œuvre en liant l'expression à une variable, puis en la répétant une fois dans la clause else du if, puis dans le canevas auquel vous tombez.

S'il n'y a aucun cas tomber jusqu'à (comme dans votre exemple) on aura été inséré par l'étape b, qui insère un cas par défaut _ -> error "No match"

+0

Merci pour la référence. J'aimerais pouvoir marquer une branche comme une erreur de correspondance de modèle, mais je peux voir pourquoi une telle fonctionnalité n'est pas offerte par le langage. Merci! – Ozgur

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

exactement le genre d'erreur déclenchée par un cas non prise en charge est non spécifié par la définition du langage, et varie du compilateur au compilateur.

éditer: S'il y a plusieurs gardes et/ou modèles, chaque garde ou modèle correspond à la partie non-correspondante du cas précédent.

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

produit

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

Yaha! Il y a un problème ici. ce n'est pas une erreur de correspondance de modèle. que se passe-t-il s'il y a un autre cas après cette ligne? – Ozgur

+2

@Ozgur: Si vous voulez une réponse complète, n'essayez pas d'appâter des gens avec des questions intentionnellement mal formulées. – Akusete

+0

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

Questions connexes