我只是在阅读有关 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
(两个参数(。第二个有两个功能体;使用哪一个是通过模式匹配决定的。