我只是在阅读有关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;
)
答案 0 :(得分:1)
我会这样写两个函数:
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]
等效,后者将列表分解为Head和Tail,其中Head是列表的第一个元素,而Tail是列表的其余部分。变量名称_
意味着您不在乎变量,因此您不会在函数主体中使用它。在这种情况下,这意味着您不必关心列表的标题,只需要列表的尾部即可。如果在函数子句的开头使用了命名变量,而在函数主体中没有使用该变量,则编译器会警告您。
这是一个如何使用模式匹配来解构列表的示例:
-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>
答案 1 :(得分:0)
不。这里定义了两个函数:while/1
(一个参数)和while/2
(两个参数)。第二个有两个功能主体;通过模式匹配来决定使用哪个。