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)
模式匹配的语义在标准的以下部分中定义:模式匹配的形式语义。
与您的问题相关的步骤是 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"