February 2, 2008
一個前のエントリーの続き。
ひろきのだいちくんの例を見てから,改めて自分の例についてちょっと考えた.
n番目からn+1番目を作る関数が引数としてn番目の値しか受け取れなくて,フィボナッチとか書きたいときに,なんかスマートじゃない。
次の値を計算する関数が,値と一緒にさらに次の値を計算する関数を返せばいい。てか参考にした本
では最初からそうなってた(爆
自然数の場合は現在の値から次の値を作り出すには常に1を足すだけでよいから簡単。
var nat = [1, function (x) { return [x + 1, arguments.callee]; }];
フィボナッチだと次の値を作り出すために,現在の値とひとつ前の値が必要なので少し複雑。
var fib = [0, function (x) {
var succ = function (x) {
return function(y) {
return [x+y, succ(y)];
};
};
return [x+1, succ(x)];
}];
で,pos, take, mapはこんな感じか。
function next(n) {
return n[1](n[0]);;
}
function pos(ix, n) {
for (var i=0;i<ix;i++) {
n = next(n);
}
return n[0];
}
function take(n, inflist) {
var ary = [];
for (var i=0;i<n;i++) {
ary.push(inflist[0]);
inflist = next(inflist);
}
return ary;
}
function map(func, n) {
var succ = function (n) {
return function (_) {
n = next(n);
return [func(n[0]), succ(n)];
};
};
return [func(n[0]), succ(n)];
}
実行してみる。
print(take(10, fib)); //0,1,1,2,3,5,8,13,21,34 print(pos(99, fib)); // 218922995834555200000
結局全然JavaScript風じゃないっていう。
元のamachangのエントリーの弾さんのコメントの意味が全然わからないよぅ(汗
