守卫沮丧

Ozg*_*gur 12 syntax haskell syntactic-sugar guard

我经常听到这句话,警卫只是if-then-else(或case case)的语法糖.

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

halfOf :: Int -> Int
halfOf x | even x = div x 2
Run Code Online (Sandbox Code Playgroud)

(该功能有意为部分)

谢谢,

Hea*_*ink 12

halfOf x =
  if even x
  then div x 2
  else error "Incomplete pattern match" 
Run Code Online (Sandbox Code Playgroud)

由未处理的情况触发的确切类型的错误不是由语言定义指定的,并且因编译器而异.

编辑:如果有多个防护和/或模式,则每个防护或模式匹配都会进入前一个案例的不匹配部分.

compare x y
  | x == y = foo
  | x /= y = bar
compare _ _ = baz
Run Code Online (Sandbox Code Playgroud)

产生

compare x y =
  if x == y
  then foo
  else if x /= y
       then bar
       else baz
Run Code Online (Sandbox Code Playgroud)

  • @Ozgur:如果你想要一个完整的答案,不要试图诱惑人们故意措辞错误的问题. (2认同)
  • 哎呀,对不起.没有拖钓意图.我只想在这里了解一些事情.真. (2认同)

sep*_*p2k 4

模式匹配的语义在标准的以下部分中定义:模式匹配的形式语义

与您的问题相关的步骤是 c。如您所见,模式与以下形式的防护相匹配

case v of { p | g1 -> e1 ; ...
              | gn -> en where { decls }
            _     -> e' }
Run Code Online (Sandbox Code Playgroud)

被转换为没有保护的模式匹配:

case e' of
{y ->
   case v of {
       p -> let { decls } in
            if g1 then e1 ... else if gn then en else y ;
        _ -> y }}
Run Code Online (Sandbox Code Playgroud)

因此,模式防护是根据 来定义的if,“fallthrough”是通过将表达式绑定到变量,然后在elsethe 的子句中重复一次if,然后在您要陷入的模式中重复一次来实现的。

如果没有任何案例可供选择(如您的示例所示),则步骤 b 将插入一个案例,这会插入一个默认案例_ -> error "No match"