OCaml 垃圾收集中间结果吗?

Does OCaml garbage collect intermediate results?

假设我有一个函数

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 被释放了吗?我的程序占用了我的内存,我怀疑这是否是原因。

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

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

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

如果您有内存泄漏,您需要查看整个计算都可以访问的地方。一个例子是一个大的全局 table.