OCaml垃圾收集中间结果吗?

时间:2015-04-21 14:49:11

标签: functional-programming ocaml

假设我有一个功能

let rec f x = 
    let a = (* build a huge list, possibly used f on smaller input again here *) in 
    let b = (* build a huge list, possibly used f on smaller input again too *) in
    List.append a b

我的问题是,在调用fab被释放了吗?我的程序正在耗尽我的记忆,我怀疑这是否是原因。

2 个答案:

答案 0 :(得分:2)

f返回其值后,无法访问变量ab。因此a的值最终将被垃圾收集。对于List.append最明显的实现,b的值构成了函数结果的一部分。因此,在无法再访问此结果之前,不会对其进行垃圾回收。

如果您有内存泄漏,则需要查看整个计算可访问的位置。一个例子是一个大的全球表。

答案 1 :(得分:1)

是的,它将被释放。 OCaml垃圾收集通常不会泄漏,如果无法访问值,则会收集它。如果可以重用内存,它将被重用。

请注意,如果您使用的是非常大的数据结构,那么列表可能不是一个好选择,尤其是使用concat连接列表的效率非常低。