在一个功能程序中,我有一个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 }
当记录类型增长时,后一种样式实际上更具可读性。因此,无论如何,我可能会使用它。但出于好奇,我想知道,它是否也允许编译器更容易地检测可能的内存重用(我的应用程序是以monadic样式编写的,因此通常只会有一个记录传递,因此优化编译器可以删除所有的分配,但一个,并进行就地变异)。在我有限的视图中,with
- 语法为应用此类优化的场所提供了一个很好的启发式算法,但这是真的吗?
答案 0 :(得分:3)
您提供的remove_number
的两个版本是等效的。 { expr with ... }
表示法不会修改记录。它创造了一个新的记录。
记录修改如下所示:
let remove_number nr rec = rec.numbers <- IntSet.remove nr rec.numbers
我不认为OCaml会进行您描述的那种优化。 OCaml的计划是生成与您所写内容相近的代码。