这段代码有错误吗?



我只是在阅读有关 Erlang 语法的信息,并阅读 while 循环的实现:

-module(helloworld). 
-export([while/1,while/2, start/0]). 
while(L) -> while(L,0). 
while([], Acc) -> Acc;
while([_|T], Acc) ->
io:fwrite("~w~n",[Acc]), 
while(T,Acc+1). 
start() -> 
X = [1,2,3,4], 
while(X).

分号是错误的吗?(第四行:while([], Acc) -> Acc;(

我会这样写两个函数:

while(L) -> while(L,0). 
while([], Acc) -> Acc;
while([_|T], Acc) ->
io:fwrite("~w~n",[Acc]), 
while(T,Acc+1). 
start() -> 
X = [1,2,3,4], 
while(X).

使用空格分隔函数定义可以清楚地表明正在定义两个不同的函数:while/1 和 while/2。

我对[_|T]一无所知.它只是在本节之后 教程,所以这很令人困惑。

这几乎等同于[H|T],它将列表解构为头部和尾部,其中头部是列表的第一个元素,尾部是列表的其余部分。 变量名_意味着你不关心变量,所以你不会在函数体中使用它。 在这种情况下,这意味着您不关心列表的头部,您想要的只是列表的尾部。 如果在函数子句的头部使用了命名变量,并且您没有在函数主体中使用该变量,则编译器将向您发出警告。

下面是使用模式匹配解构列表的示例:

-module(my).
-compile(export_all).
f([Head|Tail]) -> 
io:format("The head of the list is: ~w~n", [Head]),
io:format("The tail of the list is: ~w~n", [Tail]).

在外壳中:

8> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}
9> my:f([1, 2, 3]).
The head of the list is: 1
The tail of the list is: [2,3]
ok
10> 

No.这里定义了两个函数:while/1(一个参数(和while/2(两个参数(。第二个有两个功能体;使用哪一个是通过模式匹配决定的。

最新更新