我試圖編寫一個並行排序的Qsort函數,並將此代碼直接轉換爲Elixir,但由於某種原因,當我運行pqsort:pqsort([5, 4, 3, 10, 1]).
時,它失敗並出現此錯誤:Erlang的錯誤參數錯誤spawn_link/3
** 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)).
你一定要明白,這是相比於快速排序大規模pessimization? – zxq9
是的......這只是我試驗Erlang並行性。我並不打算這麼快。我只是大部分時間都在搞亂。 –
標題更改使問題完全不同。檢查spawn_link/3的typespec:http://www.erlang.org/doc/man/erlang.html#spawn_link-3第二個參數是一個原子,而不是一個樂趣。 Funs已經構建並且已經構建 - Erlang允許您使用函數的標籤+ args列表(其長度決定了arity)在任何需要'{Mod,Fun,Args}'類型值的任何位置調用函數。 – zxq9