Considerate questa funzione:L'ottimizzatore Haskell utilizza la memoizzazione per chiamate di funzioni ripetute in un ambito?
f as = if length as > 100 then length as else 100
Poiché la funzione è puro è ovvio che la lunghezza sarà lo stesso in entrambe le chiamate. La mia domanda è: Haskell Optimizer trasforma il codice sopra in un equivalente di quanto segue?
f as =
let l = length as
in if l > 100 then l else 100
In caso affermativo, quale impostazione di livello lo abilita? Se non lo fa, allora perché? In questo scenario uno spreco di memoria non può essere la ragione spiegata in this answer, perché la variabile introdotta viene rilasciata non appena l'esecuzione della funzione è terminata.
Si prega di notare che questo non è un duplicato di this question a causa della ambito locale, e quindi si può ottenere una risposta radicalmente diversa.
Nonostante questo problema, ghc potrebbe essere molto più aggressivo con CSE. Devi solo avere una stima della dimensione del valore che stai CSEing. Una semplice stima è che i tipi di base occupano uno spazio trascurabile. – augustss
@augusts concordato. – kosmikus
In che modo 'length [1 .. 1000000]> 0' è un'operazione economica? La "lunghezza" non deve essere restituita prima che venga valutato ">"?(In ghci, l'operazione viene rallentata notevolmente quando aumentano le dimensioni della lista) –