おもしろい議論。 せっかくなので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