2013-03-17 2 views
3

Я запускаю несколько раз сейчас в подобный шаблон, который подвержен ошибкам (опечатки могут пропустить некоторое кеширование) и просто не выглядит приятным для меня. Есть ли лучший способ написать что-то подобное?Улучшенный шаблон для результатов кэширования

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' [] 

Но это не выглядит очень чистым либо. Есть ли лучший способ написать этот код?

+1

Если вы хотите поддерживать неявное состояние между вызовами функций, посмотрите 'Control.Monad.State'. – Koterpillar

+0

Вы пытаетесь создать таблицу заметок? http://www.haskell.org/haskellwiki/Memoization –

ответ

8

Другого подобный шаблон, когда вы запрашиваете ряд именованных случайных чисел:

let (x, rng') = random rng'' 
    (y, rng) = random rng' 
in (x^2 + y^2, rng) 

Это именно при использовании государственной монады является правильным путь:

import Control.Monad.State 

Для всех случайного число генераторов типа (RandomGen g) => g есть государственная монада State g, которая неявно протекает в состоянии:

do x <- state random 
    y <- state random 
    return (x^2 + y^2) 

state функция просто принимает функцию типа s -> (a, s) и превращает его в вычисление типа State s a, в данном случае:

state :: (RandomGen g) => (g -> (a, g)) -> State g a 

Вы можете запустить State вычисление с помощью runState, evalState или execState:

runState (liftA2 (\x y -> x^2 + y^2) (state random) (state random)) 
     (mkStdGen 0) 
Смежные вопросы