Erlangでambを作ろうとしたら、いつのまにかmapになっていた
30分プログラム、その515。Erlangでambを作ろうとしたら、いつのまにかmapになっていた。
id:Gemmaさんが、またambを書いていた。ホントに
ambって継続を使って、ひとつづつ計算してるけど、全部並列で計算しちゃえばよくね?と思ってErlangで作ってみた。そしたら、いつのまにか単なる並列mapになっていた。まあ、ambもconcatMapで書けるし、当然の結果だと思う。
使い方
三平方の定理を満たす整数の組を探してみる。
forever(F)-> receive X -> F(X), forever(F) end. main()-> Ans = spawn(fun() -> forever(fun(X)-> io:format("~p~n",[X]) end) end), amb([1,2,3], fun (A)-> amb([3,4,5], fun(B)-> amb([4,5,6], fun(C) -> if A*A + B*B =:= C*C -> Ans ! {A,B,C}; true -> none end end) end) end).
ソースコード
-module(amb). -compile([export_all]). amb(Xs,F) -> lists:foreach( fun(X)-> spawn(fun()-> F(X) end) end, Xs). forever(F)-> receive X -> F(X), forever(F) end. main()-> Ans = spawn(fun() -> forever(fun(X)-> io:format("~p~n",[X]) end) end), amb([1,2,3], fun (A)-> amb([3,4,5], fun(B)-> amb([4,5,6], fun(C) -> if A*A + B*B =:= C*C -> Ans ! {A,B,C}; true -> none end end) end) end).