В следующем обобщенном коде:По умолчанию способ выполнения кода в 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 :: Integral a => [a] -> [a] -> [a]
, что это не просто ++)
Как Haskell обрабатывает попытку печати setAllSorted?
Получает значения для setA и setB, вычисляет setOne, а затем сохраняет значения для setOne только в памяти (до вычисления всего остального)?
Или Haskell хранит все в памяти до тех пор, пока не получит значение для setAllSorted?
Если последнее имеет значение, то как бы я указал (используя main, do функции и все, что другие вещи IO), что он делает вместо этого?
Могу ли я сообщить программе, в которой нужно собирать и собирать мусор? Если да, то как мне это сделать?
Haskell не определяет, как ваш код выполняется вообще, только то, что должен быть результатом; этот вопрос по своей сути специфичен для реализации. – ehird