Functional programming 如何在Erlang中使用SSA累积结果?

Functional programming 如何在Erlang中使用SSA累积结果?,functional-programming,erlang,ssa,Functional Programming,Erlang,Ssa,这是一个完全实用的新手问题 我试图学习一些Erlang,并创建了一个(希望是并发的)Monte Carlo模拟,其中生成了多个进程,通过消息传递将其本地结果报告给父进程 所以在父母的过程中,我有一些 parent(NumIterations, NumProcs) -> random:seed(), % spawn NumProcs processes lists:foreach( spawn(moduleName, workerFunction,

这是一个完全实用的新手问题

我试图学习一些Erlang,并创建了一个(希望是并发的)Monte Carlo模拟,其中生成了多个进程,通过消息传递将其本地结果报告给父进程

所以在父母的过程中,我有一些

parent(NumIterations, NumProcs) ->
    random:seed(),

    % spawn NumProcs processes
    lists:foreach(
        spawn(moduleName, workerFunction, [self(), NumIterations/NumProcs, 0, 0]),
        lists:seq(0, NumProcs - 1)),

    % accumulate results
    receive
        {N, M} -> ???; % how to accumulate this into global results?
        _      -> io:format("error")
    end.
假设我要总结从衍生进程接收到的所有Ns和Ms


我知道,在函数式编程中,累加值通常是通过递归完成的,但如何在receive语句中做到这一点?

您必须在作为计算“目标”的单独过程中接收结果。下面是一种复杂的乘法方法,它显示了以下原理:

-module(example).

-export([multiply/2, loop/2]).

multiply(X, Y) ->
    Pid = spawn(example, loop, [0, Y]),
    lists:foreach(fun(_) -> spawn(fun() -> Pid ! X  end) end, lists:seq(1, Y)).

loop(Result, 0) -> io:format("Result: ~w~n", [Result]);
loop(Result, Count) ->
    receive
        X -> loop(Result + X, Count - 1)
    end.
乘法函数将X和Y相乘,方法是首先使用循环函数启动一个新进程,然后启动Y个进程,其唯一任务是将X发送到循环进程


循环进程将接收X:s并将它们相加,然后在其状态为新和时再次调用自己。这将执行Y次,然后打印结果。这基本上是Erlang的服务器模式。

您必须在作为计算“目标”的单独进程中接收结果。下面是一种复杂的乘法方法,它显示了以下原理:

-module(example).

-export([multiply/2, loop/2]).

multiply(X, Y) ->
    Pid = spawn(example, loop, [0, Y]),
    lists:foreach(fun(_) -> spawn(fun() -> Pid ! X  end) end, lists:seq(1, Y)).

loop(Result, 0) -> io:format("Result: ~w~n", [Result]);
loop(Result, Count) ->
    receive
        X -> loop(Result + X, Count - 1)
    end.
乘法函数将X和Y相乘,方法是首先使用循环函数启动一个新进程,然后启动Y个进程,其唯一任务是将X发送到循环进程

循环进程将接收X:s并将它们相加,然后在其状态为新和时再次调用自己。这将执行Y次,然后打印结果。这基本上是Erlang的服务器模式