2010-11-15 8 views
12

Ich höre oft den Ausdruck, Wachen sind nur syntaktische Zucker für Wenn-dann-sonst (oder Case-Anweisungen).guard desugaring

Kann jemand bitte desugar folgendes Beispiel:

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

(Die Funktion absichtlich teilweise ist)

Danke,

Antwort

3

Die Semantik der Musteranpassung in dem folgenden Abschnitt der Norm definiert sind: Formal Semantics of Pattern Matching.

Der Schritt, der für Ihre Frage relevant ist, ist c. Wie Sie sehen können, mit Wachen Spiele Muster der Form

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

zu Muster übersetzt Spiele ohne Wachen wie:

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

So definiert Wachen Muster in Bezug auf if und „fallthrough“ implementiert indem Sie den Ausdruck an eine Variable binden und sie dann einmal in der else-Klausel von if und dann in dem Muster wiederholen, in das Sie fallen würden.

Wenn es kein Fall durch fallen (wie in Ihrem Beispiel) wird man Schritt b eingefügt worden, die einen Standard-Fall _ -> error "No match"

+0

Danke für die Referenz. Ich würde gerne in der Lage sein, einen Zweig als Mustervergleichsfehler zu markieren, aber ich kann sehen, warum eine solche Funktionalität von der Sprache nicht angeboten wird. Vielen Dank! – Ozgur

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

Die genaue Art von Fehler durch eine nicht behandelte Fall ausgelöst wird nicht von der Sprachdefinition angegeben und variiert von Compiler zu Compiler.

bearbeiten: Wenn mehrere Wächter und/oder Muster vorhanden sind, geht jede Wächter- oder Musterübereinstimmung in den nicht übereinstimmenden Teil des vorherigen Falls.

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

produziert

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

yaha Einsätze! Es gibt ein Problem hier. Dies ist kein Musterabgleichfehler. Was passiert, wenn nach dieser Zeile ein weiterer Fall auftritt? – Ozgur

+2

@Ozgur: Wenn Sie eine vollständige Antwort wollen, versuchen Sie nicht und köder Menschen mit absichtlich falsch formulierten Fragen. – Akusete

+0

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