守卫沮丧

时间:2010-11-15 03:50:44

标签: haskell syntax syntactic-sugar guard

我经常听到这句话,警卫只是if-then-else(或案例陈述)的语法糖。

有人可以请看下面的例子:

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

(该功能有意为部分)

谢谢,

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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来定义的,而“fallthrough”是通过将表达式绑定到变量然后在else的{​​{1}}子句中重复一次来实现的。然后是你所能达到的模式。

如果没有案例要落到(如你的例子中),那么将在步骤b中插入一个插入默认案例的if