[トップ][ノート][編集履歴][一覧][最近の更新][->English]

2005/09/03/Erlang/fixedpoint

Category of Erlang

おもしろい議論。 せっかくなのでerlangでやってみた。

$ cat fix.erl
-module(fix).
-export([fix/1, fib_maker/1]).

fix (G) ->
    (G)(fun (X) -> (fix(G))(X) end).

fib_maker(F) ->
    fun (X) ->
            if X =< 1 -> 1;
               true   -> (F)(X - 1) + (F)(X - 2)
            end
    end.

$ erl
1> c(fix).
{ok,fix}
2> Fib = fix:fix(fun (X) -> fix:fib_maker(X) end).
#Fun<fix.x.xxxxxxxx>
3> lists:map(Fib, [1, 2, 3, 4, 5]).
[1,2,3,5,8]

Scheme版とほぼ同じになって芸がないなあ。つか、erlangってば関数型言語のくせに高階関数扱いづれー(yet still erlang much better than C)。

memoizeが目的の場合erlangだとこの方法は取らない。多分。 callerがspawnさせて、calleeがメモするのがerlang流。多分。 でもその場合はfibを壊さないとだめか。本末転倒。

追記

Erlang/2005/09/04/memoiseでメモにチャレンジしてみました。

blog comments powered by Disqus