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.
fonte
2012-09-12 14:52:32
@LoganCapaldo Oh, sì, capisco. Ma quel post ha circa 2 anni, forse ci sono stati dei progressi. – Cartesius00
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. –