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

Why do i get syntax error before a guard in Erlang?

我试图理解为什么我在 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 中使用复杂表达式的结果也有问题吗?我知道你不能在 guards 中使用用户定义的表达式,但我想表达式的结果是可以的。

首先,您添加了编译选项-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".

在定义函数时,-> 总是函数头中的最后一个,所以守卫总是在 ->.

之前

dispatch

守卫之后的 if 语句中
 Val=if T > 4 -> 55 ;
           T >5 -> 66 ;
        end,

您正在定义两个匹配项。如果 ; 后跟另一个匹配项,则只需要以匹配项结束一行。在具有多个头、case 语句等的函数中就是这种情况。一个好的经验法则是,如果您正在 ending 语句,则不需要在它前面加上 ;.