鑑於以下功能:瞭解Haskell的`map` - 堆棧還是堆?
f :: [String]
f = map integerToWord [1..999999999]
integerToWord :: Integer -> String
讓我們忽略的實施。下面是一個示例輸出:
ghci> integerToWord 123999
"onehundredtwentythreethousandandninehundredninetynine"
當我執行f
,做所有的結果,即f(0) through f(999999999)
獲得存儲在堆棧或堆嗎?
注意 - 我假設哈斯克爾有堆棧和堆。
運行此功能約1分鐘後,我沒有看到RAM從原來的使用增加。
是否「電流值」的意思是每一個元件,或者整個[串]?我實際上是在調用f來排序,所以我認爲在這種情況下整個列表必須存在於堆中? –
@KevinMeredith這取決於你將如何使用它。如果你打印它 - 只保留一個'String'。對於'sort'毫無疑問,它將保留整個'[String]',因爲要對列表進行排序,因此需要對整個列表進行操作*。 *從技術上講,一些算法可能更聰明,只能在最壞的情況下才會這樣做,但無論如何仍然是內存消耗的「O(N)」。 – zerkms
@KevinMeredith在分配它的地方 - 這不是我所知道的,但我最好的猜測是列表本身被分配到堆中,並且「引用」保存在堆棧中(就像它在其他任何其他地方一樣)語言自動內存管理) – zerkms