我经常听到这句话,警卫只是if-then-else(或案例陈述)的语法糖。
有人可以请看下面的例子:
halfOf :: Int -> Int
halfOf x | even x = div x 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