Способ выполнения кода по умолчанию в 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

(обратите внимание, что 'f' обозначает функцию типа

f :: Integral a => [a] -> [a] -> [a] 

не просто ++)

как Haskell обрабатывает попытку вывести setAllSorted?

Получает ли он значения для setA и setB, вычисляет setOne и затем сохраняет в памяти только значения для setOne (перед вычислением всего остального)?

Или Haskell хранит все в памяти до получения значения для setAllSorted?

Если последнее, то как мне указать программе (используя функции main, do и прочие IO), чтобы она делала первое?

Могу ли я указать программе, в каком порядке вычислять и собирать мусор? Если да, то как мне это сделать?

6
задан Benjamin 16 December 2013 в 23:42
поделиться