Sono nuovo di Haskell e capisco che è (fondamentalmente) un linguaggio puramente funzionale, che ha il vantaggio che risulta che le funzioni non cambieranno in più valutazioni. Detto questo, sono perplesso dal fatto che non possa facilmente contrassegnare una funzione in modo tale che ricordi i risultati della sua prima valutazione e non debba essere nuovamente valutata ogni volta che è necessario il suo valore.C'è un modo per "preservare" i risultati in Haskell?
In Mathematica, per esempio, c'è una simple idiom per realizzare questo:
f[x_]:=f[x]= ...
ma in Haskell, le cose più vicine che ho trovato è something like
f' = (map f [0 ..] !!)
where f 0 = ...
f n = f' ...
, che oltre ad essere molto meno chiaro (e apparentemente limitato agli argomenti Int
?) non (sembra) preservare i risultati all'interno di una sessione interattiva.
Ammettiamo (e chiaramente), non capisco esattamente cosa sta succedendo qui; ma ingenuamente, sembra che Haskel dovrebbe avere qualche modo, a livello di definizione della funzione, di
- approfittando del fatto che le sue funzioni sono funzioni e saltare ricalcolo dei risultati una volta che sono stati calcolati e
- indicando il desiderio di farlo a livello di definizione della funzione con un linguaggio semplice e pulito.
C'è un modo per farlo in Haskell che mi manca? Capisco (una specie di) che Haskell non può memorizzare le valutazioni come "stato", ma perché non può semplicemente (in effetti) ridefinire le funzioni valutate come il loro valore calcolato?
Questo nasce da this question, in cui la mancanza di questa caratteristica si traduce in prestazioni terribile.
GHC ha deciso che probabilmente si utilizzerà troppa memoria se si è ricordata l'applicazione della funzione e probabilmente è corretta. Tuttavia, ricorda le costanti. – PyRulez
Un'altra implementazione di haskell sarebbe libera di memoizzare le funzioni se fosse soddisfatta. – PyRulez