2010-11-15 90 views
12

我經常聽到這句話,衛兵只是if-then-else(或case語句)的語法糖。警衛desugaring

有人可以請desugar以下實例:

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

(功能是有意部分)

感謝,

回答

3

模式匹配的語義是在標準的以下部分定義:Formal Semantics of Pattern Matching

與您的問題相關的步驟是c。正如你所看到的,圖案的形式

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

都將轉換爲模式的警衛匹配無人看守匹配爲:

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

所以模式警衛在if條款和「下通」定義的實現通過將表達式綁定到一個變量,然後在ifelse子句中重複一次,然後再按照您將遇到的模式重複一次。

如果告吹沒有的情況下(如在你的例子)一個將被插入步驟b,這將插入一個默認的情況下_ -> error "No match"

+0

感謝您的參考。我很希望能夠將分支標記爲模式匹配錯誤,但是我明白爲什麼這種功能不是由該語言提供的。謝謝! – Ozgur 2010-11-15 18:39:37

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

確切類型的錯誤由未處理的情況下引發的是不是由語言定義指定的,並且因編譯器而異。

編輯:如果有多個警衛和/或模式,則每個警衛或模式匹配進入前一個案例的不匹配部分。

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

產生

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

呀哈!這裏有一個問題。這不是模式匹配錯誤。如果在該行之後還有另一個案例,會發生什麼? – Ozgur 2010-11-15 03:59:20

+2

@Ozgur:如果你想要一個完整的答案,不要嘗試用故意錯誤的問題來誘惑人。 – Akusete 2010-11-15 04:00:25

+0

@Ozgur:請參閱http://cs.anu.edu.au/Student/comp1100/haskell/tourofsyntax.html#Guards – Akusete 2010-11-15 04:01:59