Я запускаю несколько раз сейчас в подобный шаблон, который подвержен ошибкам (опечатки могут пропустить некоторое кеширование) и просто не выглядит приятным для меня. Есть ли лучший способ написать что-то подобное?Улучшенный шаблон для результатов кэширования
sum_with_cache' result cache ((p1,p2,p3,p4):partitions) = let
(cache_p1, sol1) = count_noncrossing' cache p1
(cache_p2, sol2) = count_noncrossing' cache_p1 p2
(cache_p3, sol3) = count_noncrossing' cache_p2 p3
(cache_p4, sol4) = count_noncrossing' cache_p3 p4
in sum_with_cache' (result+(sol1*sol2*sol3*sol4)) cache_p4 partitions
В основном N операций, которые могут обновлять кеш?
Я мог бы написать и что-то вроде:
process_with_cache' res cache _ [] = (cache, res)
process_with_cache' res cache f (x:xs) =
let (new_cache, r) = f cache x
in process_with_cache' (r:res) new_cache f xs
process_with_cache = process_with_cache' []
Но это не выглядит очень чистым либо. Есть ли лучший способ написать этот код?
Если вы хотите поддерживать неявное состояние между вызовами функций, посмотрите 'Control.Monad.State'. – Koterpillar
Вы пытаетесь создать таблицу заметок? http://www.haskell.org/haskellwiki/Memoization –