Ocaml 在同一记录的其他字段中使用记录字段

Ocaml 在同一记录的其他字段中使用记录字段,ocaml,record,mutable,circular-reference,Ocaml,Record,Mutable,Circular Reference,我想知道在OCaml中是否可以在同一条记录的另一个字段中使用一个记录字段 基本上,我有一个带函数的字段,我想在其中使用同一记录的其他值和字段,因此当值更改时,函数将使用新值 我可以通过设置函数字段mutable来实现这一点,并在创建记录后进行更新,例如 type 'a cell = { mutable value: 'a ; mutable fn: unit -> 'a } let create_cell ~(value : 'a) : 'a cell = let c = {

我想知道在OCaml中是否可以在同一条记录的另一个字段中使用一个记录字段

基本上,我有一个带函数的字段,我想在其中使用同一记录的其他值和字段,因此当值更改时,函数将使用新值

我可以通过设置函数字段
mutable
来实现这一点,并在创建记录后进行更新,例如

type 'a cell =
  { mutable value: 'a
  ; mutable fn: unit -> 'a }

let create_cell ~(value : 'a) : 'a cell =
  let c = {value; fn= (fun () -> value + 42)} in
  let _ = c.fn <- (fun () -> c.value + 42) in
  c
键入“a单元格”=
{可变值:'a
;可变fn:unit->'a}
让我们创建一个单元格(值:'a):'a单元格=
让c={value;fn=(fun()->value+42)}in
让=c.fn c.value+42)输入
C

我想知道,如果
fn
字段不可一次更改,是否有可能实现此功能。

您可以使用
let rec
使函数引用它所属的记录:

# type 'a cell = { mutable value : 'a ; fn : unit -> 'a };;
type 'a cell = { mutable value : 'a; fn : unit -> 'a; }
# let rec r = { value = 14; fn = fun () -> r.value + 14 };;
val r : int cell = {value = 14; fn = <fun>}
# r.fn ();;
- : int = 28
# r.value <- 10;;
- : unit = ()
# r.fn ();;
- : int = 24
这似乎有效:

# let mycell = create_cell ~value: 88;;
val mycell : int cell = {value = 88; fn = <fun>}
# mycell.fn ();;
- : int = 130
# mycell.value <- 100;;
- : unit = ()
# mycell.fn ();;
- : int = 142
#让mycell=create_cell~value:88;;
val mycell:int cell={value=88;fn=}
#mycell.fn();;
-:int=130
#迈塞尔价值
# let mycell = create_cell ~value: 88;;
val mycell : int cell = {value = 88; fn = <fun>}
# mycell.fn ();;
- : int = 130
# mycell.value <- 100;;
- : unit = ()
# mycell.fn ();;
- : int = 142