我經常聽到這句話,衛兵只是if-then-else(或case語句)的語法糖。警衛desugaring
有人可以請desugar以下實例:
halfOf :: Int -> Int
halfOf x | even x = div x 2
(功能是有意部分)
感謝,
我經常聽到這句話,衛兵只是if-then-else(或case語句)的語法糖。警衛desugaring
有人可以請desugar以下實例:
halfOf :: Int -> Int
halfOf x | even x = div x 2
(功能是有意部分)
感謝,
模式匹配的語義是在標準的以下部分定義: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
條款和「下通」定義的實現通過將表達式綁定到一個變量,然後在if
的else
子句中重複一次,然後再按照您將遇到的模式重複一次。
如果告吹沒有的情況下(如在你的例子)一個將被插入步驟b,這將插入一個默認的情況下_ -> error "No match"
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
感謝您的參考。我很希望能夠將分支標記爲模式匹配錯誤,但是我明白爲什麼這種功能不是由該語言提供的。謝謝! – Ozgur 2010-11-15 18:39:37