如何修复使用'以及#39;和','在Erlang的守卫测试中

时间:2017-05-14 05:17:15

标签: erlang

在“为了大好而学习你的一些二郎”这本书中,它说"最好的策略通常是在必要时将它们混合在一起#34;关于' andalso',' orelse',','和&#39 ;;'。 所以,我尝试像这样编码,但它编译失败。

right_age(X) when (X>=18,X=<60) orelse (X=:=9) -> true;
right_age(_) -> false.

请给我一个正确的例子,谢谢。

3 个答案:

答案 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.