我试图理解为什么我在守卫者的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
中使用复杂表达式的结果还存在问题吗?我知道您不允许在警卫中使用用户定义的表达式,但我认为表达式的结果还可以。
答案 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}}。