在函数式程序中,我有一个 API,它提供作为记录实现的复杂状态的函数:
let remove_number nr {counter ; numbers ; foo } = {counter ; numbers = IntSet.remove nr numbers ; foo}
let add_fresh {counter ; numbers ; foo } = { counter = counter + 1 ; numbers = IntSet.add counter numbers ; foo }
我知道,我可以使用简化的记录修改语法,如下所示:
let remove_number nr state = { state with numbers = IntSet.remove nr numbers }
当记录类型增长时,后一种风格实际上更具可读性。因此,无论如何我可能都会使用它。但出于好奇,我想知道它是否还允许编译器更轻松地检测可能的内存重用(我的应用程序是用一元风格编写的,因此通常只会传递一条记录,因此优化编译器可以删除除一项外的所有分配,并进行就地突变)。在我有限的观点中,
with
语法为应用此类优化的地方提供了很好的启发,但这是真的吗?
您提供的
remove_number
的两个版本是等效的。 { expr with ... }
符号不会修改记录。它创造了新纪录。
记录修改如下所示:
let remove_number nr rec = rec.numbers <- IntSet.remove nr rec.numbers
我不认为 OCaml 会进行您所描述的那种优化。 OCaml 的计划是生成接近您编写的代码。