鉴于以下功能:了解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