memoizeと不動点の追記
[id:lethevert:20050904:p3]
Concurrent Clean版の
fix :: ( (Int -> Int) -> (Int -> Int) ) -> (Int -> Int) fix maker = f where f = maker f
と、JavaScript, Scheme版のそれ
function fix(G) { function f(x) { return f(x) } f = G(f) return f }
(define (fix g) (begin (define (f x) (f x)) (set! f (g f)) f))
は、よく考えると意味が違いますね。
つまり、Clean版は、局所的に定義された「f = maker f」という再帰関数を返値として返しているのに対し、JavaScript版とScheme版は、「f = G(f)」は代入です。
そういうことから、Clean版は、意味的に分かりやすいですが、JavaScript版とScheme版は、ちょっと分かりにくいように思います。