Functional programming 这个代码有错误吗?

Functional programming 这个代码有错误吗?,functional-programming,erlang,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,

我正在阅读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/1一个参数和while/2两个参数。第二个有两个功能体;使用哪一个取决于模式匹配。

我将这样编写两个函数:

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

我不知道。就在这一部分后面 教程,所以这很混乱

这几乎相当于[H | T],它将列表分解为头和尾,头是列表的第一个元素,尾是列表的其余部分。变量名u表示您不关心该变量,因此不会在函数体中使用它。在本例中,这意味着您不关心列表的开头,您只需要列表的结尾。如果在函数子句的开头使用了命名变量,而在函数体中没有使用该变量,那么编译器将向您发出警告

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

-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> 

谢谢,我刚刚意识到教程中有一个部分叫做模式匹配,它也解释了我不知道的[124; T]语法。它就在教程的这一部分之后,所以这非常混乱,希望在我进入这一部分后,它会变得清晰。一个初学者的问题,cmy意味着什么?@pileup,您可以在终端窗口中使用erl命令启动一个erlangshell。您必须在计算机上安装erlang,erl命令才能工作。一旦shell启动,就可以编译erlang程序,在我的示例中,它位于名为my.erl的文件中。在调用程序中定义的函数之前,必须编译erlang程序。erlang shell命令cmy将my.erl编译成名为my.beam的文件。编译程序后,可以使用shell调用程序中定义的函数,例如my:f[1,2,3]。