在“为了大好而学习你的一些二郎”这本书中,它说"最好的策略通常是在必要时将它们混合在一起#34;关于' andalso',' orelse',','和&#39 ;;'。 所以,我尝试像这样编码,但它编译失败。
right_age(X) when (X>=18,X=<60) orelse (X=:=9) -> true;
right_age(_) -> false.
请给我一个正确的例子,谢谢。
答案 0 :(得分:3)
参见定义here:
保护序列是一系列守卫,由分号(;)分隔。如果至少有一个守卫是真的,则保护序列为真。 (其余的警卫,如果有的话,不予评估。)
Guard1;...;GuardK
guard是一系列保护表达式,以逗号(,)分隔。如果所有守卫表达都评估为真,那么后卫就是真的。
GuardExpr1,...,GuardExprN
因此,您不能像原始代码一样将,
内的orelse
分隔开来。写守卫的正常方式是when X>=18, X=<60; X=:=9
。
答案 1 :(得分:1)
请注意以下编译:
-module(my).
-export([right_age/1]).
right_age(X) when (X>=18),(X=<60 orelse X=:=9) ->
true;
right_age(_) ->
false.
守卫的形式为
expression punctuation expression
但是你的后卫会这样做:
(X>=18,X=<60) ->
其中括号跨越标点符号,并且显然括号的优先级高于标点符号,因此括号形成一个表达式,并且您的后卫的格式为:
expres punctuation sion
不好:它没有编译。因此看起来规则是: 括号不能跨越守卫标点 。
守卫中的表达式也可以是复合布尔表达式,例如:
X=<60 orelse X=:=9
虽然,我不知道原因,但它已经成功了。
right_age(X) when (X>=18 andalso X=<60) ; (X=:=9) -> true; right_age(_) -> false.
我们来看看:
compound_boolean_expression expression
| |
V V
when (X>=18 andalso X=<60) ; (X=:=9)
^
|
punctuation
所以,你有:
compound_boolean_expression punctuation expression
这是合法的。请注意,您不需要括号:
right_age(X) when X>=18 andalso X=<60; X=:=9 ->
true;
right_age(_) ->
false.
答案 2 :(得分:0)
虽然,我不知道原因,但它已经成功。
right_age(X) when (X>=18 andalso X=<60) ; (X=:=9) -> true;
right_age(_) -> false.