fix

Jul 07, 2009 01:50

Ковырялся тут с fix, написал такую штуку:
fib self 0 = 1
fib self 1 = 1
fib self n = self (n - 2) + self (n - 1)

fixMemo f = let x = f (map x [0..] !!) in x
fixMemo fib 10000 отрабатывает почти мгновенно, в отличие от.

Других открытий, правда, не сделал, а они есть?

haskell

Leave a comment

Comments 10

beroal July 7 2009, 02:18:59 UTC
Это напомнило мне следующий пост: From Löb's Theorem to Spreadsheet Evaluation. В fixMemo ты для кэширования используешь список, преобразуя Int -> num в [num] и обратно. Оба типа являются функтором от num. Поэтому fixMemo можно определить через loeb:

fibMemoLoeb = loeb (map (\n memo -> fib (memo !!) n) [0..])
А это обычная функция Фибоначчи, без кэширования:

fibLoeb :: (Num a, Num b) => a -> b
fibLoeb = loeb (\n self -> fib self n)
где

loeb x = let y = fmap (\a -> a y) x in y

Reply

deni_ok July 7 2009, 07:38:52 UTC
О, какая хорошая функция

loeb :: (Functor f) => f (f b -> b) -> f b

Reply

beroal July 7 2009, 18:41:30 UTC
Хороша для медитаций? ;)

Reply

deni_ok July 7 2009, 18:42:57 UTC
Именно!

Reply


Leave a comment

Up