Functional programming OCaml垃圾收集中间结果吗?

Functional programming OCaml垃圾收集中间结果吗?,functional-programming,ocaml,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 我的问题是,调用f后a和b是否被释放?我的程序正在消耗我的内存,我怀疑这是

假设我有一个函数

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

我的问题是,调用
f
a
b
是否被释放?我的程序正在消耗我的内存,我怀疑这是否是原因。

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


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

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


如果您有内存泄漏,您需要查找整个计算过程中可访问的位置。一个例子是一个大的全局表。

“那么也许地图不是一个好的选择”,我想你的意思是列表不是一个很好的选择?哈哈,是的,列表是一个不好的选择。是的,
set
map
可能更适合。在按值调用语言中附加列表通常不太好,除非有人继续删除它。如果实现不使用尾部递归模cons之类的东西,事情会变得特别糟糕——一个天真的实现会将第一个列表反转两次,这不是很好。