【问题标题】:Does this code have a mistake?这段代码有错误吗?
【发布时间】:2018-12-06 12:32:04
【问题描述】:

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

【问题讨论】:

    标签: functional-programming erlang


    【解决方案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],它将列表解构为头部和尾部,其中头部是列表的第一个元素,尾部是列表的其余部分。变量名_ 表示你不关心这个变量,所以你不会在函数体中使用它。在这种情况下,这意味着你不关心列表的头部,你想要的只是列表的尾部。如果在函数子句的头部使用了命名变量,而你没有在函数体中使用该变量,那么编译器会给你一个警告。

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

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

    【讨论】:

    • 一个初学者的问题,c(my)是什么意思?
    • @pileup,您在终端窗口中使用erl 命令启动一个erlang shell。您必须在您的计算机上安装 erlang,erl 命令才能工作。一旦 shell 启动,您就可以编译您的 erlang 程序,在我的示例中,该程序位于名为 my.erl 的文件中。在调用程序中定义的函数之前,您必须编译您的 erlang 程序。 erlang shell 命令c(my) 将my.erl 编译成一个名为my.beam 的文件。编译程序后,您可以使用 shell 调用程序中定义的函数,例如my:f([1, 2, 3]).
    【解决方案2】:

    没有。这里定义了两个函数:while/1(一个参数)和while/2(两个参数)。第二个有两个功能体;使用哪一个是通过模式匹配来决定的。

    【讨论】:

    • 谢谢,我刚刚意识到教程中有一节叫做“模式匹配”,它也解释了我不知道的 [_|T] 的语法。它只是在教程的这一部分之后出现,所以非常混乱,希望在我到达该部分后会清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多