В следующем обобщенном коде:
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 do функции и все остальное, что касается ввода-вывода), что вместо этого он выполняет первый?
Могу ли я сообщить программе, в каком порядке вычислять и собирать мусор? Если так, то как бы я это сделал?