Function.prototype.state = function() { return undefined };
force = function(v) {
return typeof v == 'function' && v.length == 0 ? force(v()) : v;
};
memo = function(f, k, v) {
var state = f.state;
f.state = f.state(k) !== undefined ? state : function(a) { return a === k ? v : state(a) }
return v;
};
memoise = function(f) {
return function(k) {
var v = f.state(k);
return v !== undefined ? v : memo(f, k, force(f(k)))
}
};
memoised_add = memoise(function(a) { return memoise(function(b) { return function() { return force(a) + force(b) } })});
force(memoised_add (1) (2))
force(memoised_add (1) (3))
- 効率は悪いので実用的ではありません
- 引数が文字列以外のオブジェクトでもメモ化してくれます
- 関数のプロパティが状態を持っているので純粋ではありません。