En el siguiente código generalizada:modo por defecto de ejecución de código en 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
(tenga en cuenta que 'f' es sinónimo de una función del tipo
f :: Integral a => [a] -> [a] -> [a]
que no es simplemente ++)
¿Cómo se maneja Haskell al intentar imprimir setAllSorted?
¿obtiene los valores de setA y setB, calcula setOne y luego solo conserva los valores de setOne en la memoria (antes de calcular todo lo demás)?
¿O Haskell guarda todo en la memoria hasta que obtiene el valor para setAllSorted?
Si este último es el caso, ¿cómo podría especificar (utilizando main, do funciones y todas esas otras cosas IO) que haga el anterior en su lugar?
¿Puedo decirle al programa en qué orden calcular y recoger basura? Si es así, ¿cómo lo haría?
Haskell no define en absoluto cómo se ejecuta su código, solo cuál debe ser el resultado; esta pregunta es intrínsecamente específica de la implementación. – ehird