为什么在Erlang中的守卫之前会出现语法错误?

时间:2019-07-17 07:41:40

标签: erlang guard

我试图理解为什么我在守卫者的Erlang中遇到此错误:

> d:/Intro/hello.erl:17: syntax error before: 'when'
> d:/Intro/hello.erl:13: function dispatch/1 undefined
> d:/Intro/hello.erl:2: Warning: export_all flag enabled - all functions
> will be exported error

代码

-module(hello).
-compile([export_all,debug_info]).
-export([pany/1]).


isList([])->true;
isList([_|_])->true;
isList(_)->false.

pany(X)->
    IsList=isList(X),
    Result=if IsList == true -> "Its a list";
              IsList == false -> dispatch(X)
            end,
    Result.

dispatch(T)-> when T>3 ->
    Val=if T > 4 -> 55 ;
           T >5 -> 66 ;
        end,
    if (Val+1)==67 -> "lalalal" end;
dispatch(_)->"no result".

为什么说dispatch是未定义的?我不想导出它,它仅在模块内部使用。 在if中使用复杂表达式的结果还存在问题吗?我知道您不允许在警卫中使用用户定义的表达式,但我认为表达式的结果还可以。

2 个答案:

答案 0 :(得分:3)

首先,您添加了编译选项-compile([export_all,debug_info]).,因此它将启用导出模块中的所有功能。解决方案:将其删除

您的dispatch/1函数具有一些冗余->;。您应该像下面这样更改它:

-module(test).
-compile([debug_info]).
-export([pany/1]).


isList([])->true;
isList([_|_])->true;
isList(_)->false.

pany(X)->
    IsList=isList(X),
    Result=if IsList == true -> "Its a list";
              IsList == false -> dispatch(X)
            end,
    Result.

dispatch(T) when T>3 ->
    Val=if T > 4 -> 55 ;
           T >5 -> 66 
        end,
    if (Val+1)==67 -> "lalalal" end;
dispatch(_)->"no result".

答案 1 :(得分:2)

在定义函数时,->始终是函数头中的最后一件事,因此,防护措施始终位于->之前。

dispatch的警卫之后的if语句中

 Val=if T > 4 -> 55 ;
           T >5 -> 66 ;
        end,

您要定义两个匹配项。 ;仅在以匹配结束的情况下才需要跟随另一匹配。在具有多个头,case语句等的函数中就是这种情况。一个很好的经验法则是,如果您在end中声明,则不需要在其前面加上{ {1}}。