Considera il seguente frammento di codice:
-- list_1 = [1, 2, 3]
-- list_2 = [4, 5, 6]
final_list = list_1 ++ list_2
result = map (+1) final_list
Il tempo impiegato da esso è proporzionale solo alla lunghezza di final_list
e il prezzo della concatenazione di liste non viene pagato?
La mia idea è che la concatenazione avvenga pigramente; per citare la fonte di GHC Base.hs,
(++) :: [a] -> [a] -> [a]
(++) [] ys = ys
(++) (x:xs) ys = x : xs ++ ys
Poiché map
elimina costantemente la testa della lista, suppongo che la concatenazione fatta dalla chiamata ricorsiva nell'ultima riga sia sempre eseguita in un blocco con l'esecuzione di map
, quindi list_1
viene effettivamente scansionato solo una volta.
È corretto?