memoizeと不動点

[id:lethevert:20050903:p2]
できた!!

fix g = f
where
    f = g f

whereを使えば書けたんだ。
ということで、memoizeも含めたConcurrent Clean版は↓です。(リストの選択に必要な計算量はこの際無視で)

module memo

import StdEnv

Start
    = map fib [1,2,3,4,5]

//fib = fix fib_maker
fib = fix_memo fib_maker
where
    fib_maker :: (Int -> Int) Int -> Int
    fib_maker f 0 = 0
    fib_maker f 1 = 1
    fib_maker f n = f (n-1) + f (n-2)

fix :: ( (Int -> Int) -> (Int -> Int) ) -> (Int -> Int)
fix maker = f
where
    f = maker f

fix_memo :: ( (Int -> Int) -> (Int -> Int) ) -> (Int -> Int)
fix_memo maker = f
where
    f = (!!) tbl
    tbl = map (maker f) [0..]

参考)
http://d.hatena.ne.jp/tanakh/20041126#p2
http://sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part1/Chap6.html#sc6
http://www.kmonos.net/wlog/52.php#_0308050827

      • -

括弧のネストが、注釈になってしまった。HatenaでLispSchemeのソースをコピペのは、かなりめんどくさい予感

      • -

上のソースを使って、いろいろ遊んでいたら、変な数字が出てきた。よく考えたら、CleanのIntは32ビット整数値なのだった。HaskellのIntegerのような任意精度の整数ってないのかな?