这段代码有错误吗?

时间:2018-06-27 14:44:58

标签: functional-programming erlang

我只是在阅读有关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;

2 个答案:

答案 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(两个参数)。第二个有两个功能主体;通过模式匹配来决定使用哪个。