Я пытаюсь найти хороший способ запомнить функцию только для части ее домена (неотрицательные целые числа) в Haskell, используя Data.MemoCombinators
.
import Data.MemoCombinators
--approach 1
partFib n | n < 0 = undefined
| otherwise = integral fib n where
fib 0 = 1
fib 1 = 1
fib k = partFib (k-1) + partFib (k-2)
--approach 2
partFib2 n | n < 0 = undefined
| otherwise = fib n
fib = integral fib'
where
fib' 0 = 1
fib' 1 = 1
fib' n = partFib2 (n-1) + partFib2 (n-2)
Подход 1 - это то, как я хотел бы это сделать, однако, похоже, он не работает. Я предполагаю, что это потому, что функция fib
«воссоздается» каждый раз, когда вызывается partFib
, отбрасывая памятку. fib
не зависит от ввода partFib
, поэтому можно предположить, что компилятор может его поднять, но, очевидно, GHC не работает таким образом.
Подход 2 - вот как я это делаю. Черт, много отвратительной проводки.
Кто-нибудь знает лучший способ сделать это?