2010-11-15 1 views
12

Я часто слышу фразу, охранники - это просто синтаксический сахар для if-then-else (или case statement).guard 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 и «проваливаемся» реализуется связывая выражение с переменной и затем повторяя его один раз в предложении elseif, а затем в шаблоне, к которому вы попали.

Если нет ни одного случая, чтобы упасть до (как в вашем примере) один будет вставлен на стадии б, которая вставляет вариант по умолчанию _ -> error "No match"

+0

Спасибо за ссылку. Я бы хотел, чтобы отметить ветку как шаблон соответствия ошибки, но я могу понять, почему такая функциональность не предлагает язык. Благодаря! – Ozgur

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

+2

@ Ozgur: Если вы хотите получить полный ответ, не пытайтесь нападать на людей с намеренно неверно сформулированными вопросами. – Akusete

+0

@ Озгур: см. Http://cs.anu.edu.au/Student/comp1100/haskell/tourofsyntax.html#Guards – Akusete