Diciamo che abbiamo la seguente:Haskell: lista di fusione, dove è necessario?
l = map f (map g [1..100])
e vogliamo fare:
head l
Così otteniamo:
head (map f (map g [1..100]))
Ora, dobbiamo ottenere il primo elemento di Questo. map
è definito qualcosa in questo modo:
map f l = f (head l) : (map f (tail l))
Allora otteniamo:
f (head (map g [1..100]))
e poi applicato ancora:
f (g (head [1..100]))
che si traduce in
f (g 1)
No intermedio Li le m sono formate, semplicemente a causa della pigrizia.
Questa analisi è corretta? E con strutture semplici come questa:
foldl' ... $ map f1 $ map f2 $ createlist
sono liste intermedie mai create, anche senza "lista fusion"? (Penso che la pigrizia dovrebbe eliminarli banalmente).
L'unico posto dove posso vedere un motivo per mantenere una lista è se abbiamo fatto:
l' = [1..100]
l = map f (map g l')
Dove potremmo voler mantenere l'
, se viene usato altrove. Tuttavia, nel caso l'
qui sopra, dovrebbe essere abbastanza banale per il compilatore rendersi conto più rapidamente solo per ricalcolare l'elenco sopra che memorizzarlo.