2012-09-12 15 views
6

Eventuali duplicati:
When is memoization automatic in GHC Haskell?Haskell e memoization della funzione puro risultati

Di conseguenza, pura funzione restituisce sempre lo stesso valore per un input fisso. Detto questo, Haskell (più precisamente GHC) memorizza automaticamente (memoize) questi risultati se c'è abbastanza memoria (domanda 1) e lo sviluppatore ha qualche controllo su di esso (domanda 2)?

+1

@LoganCapaldo Oh, sì, capisco. Ma quel post ha circa 2 anni, forse ci sono stati dei progressi. – Cartesius00

+3

Se si modifica la domanda a a) si riconosce l'altra eb) si chiarisce cosa intendi per "avanzamento" rispetto alla risposta all'originale e o perché o perché "avanzamento" si verificherebbe che potrebbero esserci delle risposte preziose. Non sono pronto a entrare, ma penso che scoprirai che la memoizzazione automatica del tipo che potresti immaginare è una lattina più grande di worm che potrebbe apparire a prima vista. –

risposta

11

ho votato per chiudere, ma risposta breve:

GHC non fa alcun Memoizzazione automatica di funzioni, e che è probabilmente una buona cosa perché renderebbe complessità spaziale ancora più difficile ragionare su. Inoltre, la memoizzazione non è in generale un problema molto risolvibile, poiché richiede che l'argomento della funzione sia comparabile per l'uguaglianza che non è realmente possibile per tutti i tipi (ad esempio, le funzioni).

Haskell ha una semantica non rigida. GHC fornisce una, più o meno, chiamata dal modello di costo necessario. Sebbene il sovraccarico di una valutazione lenta a livelli di ottimizzazione elevati non è poi così negativo a causa dell'analizzatore di rigidità.

È molto semplice implementare la memoizzazione in Haskell utilizzando la valutazione lazy. Attenzione però all'utilizzo dello spazio.

fib' :: (Integer -> Integer) -> Integer -> Integer 
fib' f 0 = 0 
fib' f 1 = 1 
fib' f n | n > 1 = (f (n - 1)) + ((f (n - 2)) 

slow_fib :: Integer -> Integer 
slow_fib = fib' slow_fib 

fibs :: [Integer] 
fibs = map (fib' memo_fib) [0..] 

memo_fib :: Integer -> Integer 
memo_fib n = fibs !! n 

Questo in realtà non è così veloce, ed è una perdita di spazio, ma cattura l'idea generale. È possibile learn more on the Haskell wiki.

Problemi correlati