Functional programming 这个代码有错误吗?
我正在阅读Erlang的语法,并阅读while循环的实现: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,
-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]。