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).