我正在尝试编写一个并行排序的Qsort函数,并将此代码直接转换为Elixir,但出于某种原因,当我运行pqsort:pqsort([5, 4, 3, 10, 1]).
时,它会因此错误而失败:
** exception error: bad argument
in function spawn_link/3
called as spawn_link(pqsort,#Fun<pqsort.0.102886275>,[<0.33.0>,[3,2,1]])
in call from pqsort:pqsort_worker/2 (pqsort.erl, line 6)
这是我的代码:
-module(pqsort).
-export([pqsort/1, pqsort_worker/2]).
pqsort_worker(Listener, []) -> Listener ! {self(), []};
pqsort_worker(Listener, [H | T]) ->
PID_1 = spawn_link(pqsort, fun pqsort_worker/2, [self(), [ X || X <- T, H >= X ]]),
PID_2 = spawn_link(pqsort, fun pqsort_worker/2, [self(), [ Y || Y <- T, H < Y ]]),
receive
{PID_1, List_1} ->
receive
{PID_2, List_2} -> Listener ! {self(), List_1 ++ [H] ++ List_2}
end;
{PID_2, List_2} ->
receive
{PID_1, List_1} -> Listener ! {self(), List_1 ++ [H] ++ List_2}
end
end.
pqsort(List) -> element(2, pqsort_worker(self(), List)).
答案 0 :(得分:1)
如果你去documentation,你会注意到第二个参数不是函数而是原子
只需更改
PID_1 = spawn_link(pqsort, fun pqsort_worker/2, [self(), [ X || X <- T, H >= X ]]),
PID_2 = spawn_link(pqsort, fun pqsort_worker/2, [self(), [ Y || Y <- T, H < Y ]]),
到
PID_1 = spawn_link(pqsort, pqsort_worker, [self(), [ X || X <- T, H >= X ]]), |(emacs@Mac-mini-de-Rodrigo)1> c("/Users/rorra/erlang/pqsort", [{outdir, "/Users/rorra/erlang/"}\
PID_2 = spawn_link(pqsort, pqsort_worker, [self(), [ Y || Y <- T, H < Y ]]),