为什么我在 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
语句等的函数中就是这种情况。一个好的经验法则是,如果您正在 end
ing 语句,则不需要在它前面加上 ;
.
我试图理解为什么我在 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
Val=if T > 4 -> 55 ;
T >5 -> 66 ;
end,
您正在定义两个匹配项。如果 ;
后跟另一个匹配项,则只需要以匹配项结束一行。在具有多个头、case
语句等的函数中就是这种情况。一个好的经验法则是,如果您正在 end
ing 语句,则不需要在它前面加上 ;
.