Erlang 如何在calc函数中读取add(N)函数的返回值?

Erlang 如何在calc函数中读取add(N)函数的返回值?,erlang,Erlang,我是Erlang新手,我需要生成两个运行add函数的进程,然后添加 两个数字。 进程1和进程2的赋值正在显示进程id,我需要捕获该值 如何在我的calc函数中读取add(N)函数的返回值 -module(myerl). -export([calc/1,add/1]). add(N) -> N + 5. calc(L) pone = spawn( fun() -> add(A) end), ptwo = spawn( fun() -> add(B) end)

我是Erlang新手,我需要生成两个运行add函数的进程,然后添加 两个数字。 进程1和进程2的赋值正在显示进程id,我需要捕获该值

如何在我的
calc
函数中读取add(N)函数的返回值

-module(myerl).
-export([calc/1,add/1]).

add(N) ->
    N + 5.


calc(L)

pone = spawn( fun() -> add(A) end),   
ptwo = spawn( fun() -> add(B) end),

Result = Pone + Ptwo,
io:format("result ~p~n", [Result]). 

您需要使用消息传递。您必须向调用进程发送一条消息,返回结果。
spawn
函数将PID(进程标识符)返回给新生成的进程,而不是其执行的结果

此示例应满足您的期望:

calc(A, B) ->
    Self = self(),       % The spawned funs need a Pid to send to, use a closure
    POne = spawn(fun() -> Self ! {self(), add(A)} end),
    PTwo = spawn(fun() -> Self ! {self(), add(B)} end),
    wait_for_response(POne, PTwo, 0).

wait_for_response(undefined, undefined, Sum) ->
    Sum;
wait_for_response(POne, PTwo, Sum) ->
    receive
        {POne, V} -> wait_for_response(undefined, PTwo, Sum + V);
        {PTwo, V} -> wait_for_response(POne, undefined, Sum + V)
    end.

您需要使用消息传递。您必须向调用进程发送一条消息,返回结果。
spawn
函数将PID(进程标识符)返回给新生成的进程,而不是其执行的结果

此示例应满足您的期望:

calc(A, B) ->
    Self = self(),       % The spawned funs need a Pid to send to, use a closure
    POne = spawn(fun() -> Self ! {self(), add(A)} end),
    PTwo = spawn(fun() -> Self ! {self(), add(B)} end),
    wait_for_response(POne, PTwo, 0).

wait_for_response(undefined, undefined, Sum) ->
    Sum;
wait_for_response(POne, PTwo, Sum) ->
    receive
        {POne, V} -> wait_for_response(undefined, PTwo, Sum + V);
        {PTwo, V} -> wait_for_response(POne, undefined, Sum + V)
    end.

@坎贝尔汤的解释很好。我本能地做了一些稍有不同的事情,以一种玩具的方式,预期孩子会有一些不好的行为。此外,我允许输入是一个数字列表,而不仅仅是2

-module(myerl).
-export([calc/1, add/1]).

calc(NumList) when is_list(NumList)->
    Parent = self(),
    _Pids = [spawn(fun()-> Parent ! add(ANum) end) || ANum <- NumList],
    collect(length(NumList), 0);
calc(_) -> 
    {error, badarg}.

collect(0, Sum)   -> 
    Sum;
collect(Cnt, Sum) ->
    receive
        N when is_number(N) -> 
            collect(Cnt-1, Sum + N);
        _Bad ->  % returned something that isnt a number
            collect(Cnt-1, Sum)
    after 1000 -> % died or is too slow
        collect(Cnt-1, Sum)
    end.

add(N) -> 
    N + 5.
-模块(myerl)。
-导出([calc/1,add/1])。
计算(NumList)何时为列表(NumList)->
Parent=self(),
_Pids=[spawn(fun()->Parent!add(ANum)end)| ANum
{错误,badarg}。
收取(0,总和)->
总和
收集(Cnt、Sum)->
接收
N何时是_编号(N)->
收集(Cnt-1,总和+N);
_错误->%返回的内容不是数字
收集(Cnt-1,总和)
1000后->%死亡或速度太慢
收集(Cnt-1,总和)
结束。
添加(N)->
N+5。

@Soup d'Campbell'的解释很好。我本能地做了一些稍有不同的事情,以一种玩具的方式,预测子进程会出现一些不良行为。此外,我允许输入是一个数字列表,而不仅仅是2

-module(myerl).
-export([calc/1, add/1]).

calc(NumList) when is_list(NumList)->
    Parent = self(),
    _Pids = [spawn(fun()-> Parent ! add(ANum) end) || ANum <- NumList],
    collect(length(NumList), 0);
calc(_) -> 
    {error, badarg}.

collect(0, Sum)   -> 
    Sum;
collect(Cnt, Sum) ->
    receive
        N when is_number(N) -> 
            collect(Cnt-1, Sum + N);
        _Bad ->  % returned something that isnt a number
            collect(Cnt-1, Sum)
    after 1000 -> % died or is too slow
        collect(Cnt-1, Sum)
    end.

add(N) -> 
    N + 5.
-模块(myerl)。
-导出([calc/1,add/1])。
计算(NumList)何时为列表(NumList)->
Parent=self(),
_Pids=[spawn(fun()->Parent!add(ANum)end)| ANum
{错误,badarg}。
收取(0,总和)->
总和
收集(Cnt、Sum)->
接收
N何时是_编号(N)->
收集(Cnt-1,总和+N);
_错误->%返回的内容不是数字
收集(Cnt-1,总和)
1000后->%死亡或速度太慢
收集(Cnt-1,总和)
结束。
添加(N)->
N+5。

我追求简单,但强调彻底。尽管我必须指出,如果你真的想预测不良行为,你应该使用
spawn\u monitor
甚至
Parent!catch add(ANum)
谢谢Jro的回答。你能解释一下这句话吗?我没有把这部分加粗,“| | ANum”这是一个列表理解,对NumList的每个元素都“说”类似的话,(让它称为ANum),做| |左边的stuf。这实际上是一个糟糕的解释,看一看我是为了简单,但却指出了彻底性。尽管我必须指出,如果你真的想预测不良行为,你应该使用
spawn\u monitor
甚至
Parent!catch add(ANum)
谢谢Jro的回答。你能解释一下这句话吗?我没有把这部分加粗,“| | ANum”这是一个列表理解,对NumList的每个元素都“说”类似的话,(让它称为ANum),做| |左边的stuf。这实际上是一个糟糕的解释,看看@Shaka如果你在这里找到了解决方案,你应该接受answer@Shaka如果你在这里找到了解决方案,你应该接受答案