记录修改有好处/惩罚吗?

问题描述 投票:0回答:1

在函数式程序中,我有一个 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
语法为应用此类优化的地方提供了很好的启发,但这是真的吗?

  • OCaml 是否甚至优化(不需要的)记录分配?
  • 在应用任何优化之前记录修改语法是否降低?
  • 最后,ocaml 中是否实现了模式识别 编译器,告诉它有一种“便宜”的方法来创建一个 通过就地修改“死”值来记录表达式(以及如何 通常称为优化)?
optimization ocaml
1个回答
3
投票

您提供的

remove_number
的两个版本是等效的。
{ expr with ... }
符号不会修改记录。它创造了新纪录。

记录修改如下所示:

let remove_number nr rec = rec.numbers <- IntSet.remove nr rec.numbers

我不认为 OCaml 会进行您所描述的那种优化。 OCaml 的计划是生成接近您编写的代码。

© www.soinside.com 2019 - 2025. All rights reserved.