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