【问题标题】:Concurrency in ErlangErlang 中的并发
【发布时间】:2021-05-22 16:12:21
【问题描述】:

我要解决的问题如下:

编写一个不带参数的名为 squared 的 Erlang 函数。这个函数应该等待接收消息。消息将采用 { Pid, N } 格式,您可以假设 Pid 是进程 ID,N 是数字。该函数应以 { Me, X } 的形式向进程 ID Pid 发送消息,其中 Me 是运行该函数的进程的进程 ID,X 是 N 平方的值。然后函数应该结束。

到目前为止我有这个:

-module(main).
-export([squared/0]).

squared() ->
 receive
    {Pid,N} -> Pid ! {Me, X}, squared();
 terminate -> ok
 end.

我得到的错误如下:

3> c(主)。

main.erl:7: 变量“我”未绑定

main.erl:7: 变量“X”未绑定

main.erl:7:警告:变量“N”未使用 错误

我在问题的第二部分也遇到了麻烦,它要求我们以 {Me, X} 的形式向进程 ID 发送消息。其中 Me 是进程 ID,X 是 N 平方的值。我们将如何做到这一点?

【问题讨论】:

  • 在您对问题的描述中,函数squared/0 应在回复消息后立即结束。因此,您不需要terminate -> ok,并且由于您的函数不是递归的,因此该进程将在发送答案后立即终止。未绑定意味着当您尝试使用该变量时没有获得值。有关正确的代码,请参阅 @choroba 的答案。

标签: concurrency functional-programming erlang


【解决方案1】:

为了实现你的功能,你可以写一个像下面这样的函数

-module(main).
-export([squared/0]).

squared() ->
 receive
    {Pid,N} -> 
        Pid ! {self(), N*N},
        squared();
    terminate -> 
    ok
 end.

【讨论】:

    【解决方案2】:

    Me应该是接收进程的pid,即self()。 N 的平方就是 N*N。

    -module(main).
    -export([squared/0]).
    
    squared() ->
        receive
            {Pid, N} ->
                Pid ! {self(), N*N};
            terminate -> ok
        end.
    

    或者,如果你想更冗长:

    squared() ->
        Me = self(),
        receive
            {Pid, N} ->
                X = N * N,
                Pid ! {Me, X};
            terminate -> ok
        end.
    
    

    【讨论】:

      猜你喜欢
      • 2021-05-27
      • 2018-08-10
      • 2021-05-26
      • 2017-09-02
      • 2016-01-15
      • 2011-07-28
      • 2021-05-28
      • 2012-04-14
      • 2018-09-12
      相关资源
      最近更新 更多