Nel codice seguente generalizzato:modo predefinito di eseguire codice in Haskell
nat = [1..xmax]
xmax = *insert arbitrary Integral value here*
setA = [2*x | x <- nat]
setB = [3*x | x <- nat]
setC = [4*x | x <- nat]
setD = [5*x | x <- nat]
setOne = setA `f` setB
setTwo = setC `f` setD
setAll = setOne ++ setTwo
setAllSorted = quicksort setAll
(si prega di notare che 'f' si distingue per una funzione di tipo
f :: Integral a => [a] -> [a] -> [a]
che non è semplicemente ++)
in che modo Haskell gestisce il tentativo di stampare setAllSorted?
ottiene i valori per setA e setB, calcola setOne e quindi mantiene solo i valori per setOne in memoria (prima di calcolare tutto il resto)?
Oppure Haskell conserva tutto in memoria fino a quando non si ottiene il valore per setAllSorted?
Se quest'ultimo è il caso, come dovrei specificare (usando le funzioni main, do e tutte le altre cose di IO) che invece fa il primo?
Posso dire al programma in quale ordine calcolare e raccogliere i rifiuti? Se sì, come lo farei?
Haskell non definisce il modo in cui viene eseguito il codice, ma solo il risultato; questa domanda è intrinsecamente specifica per l'implementazione. – ehird