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

时间:2018-10-30 08:50:05

标签: ocaml record mutable circular-reference

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

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

我可以通过设置功能字段... panel1.Controls.Add(anotherForm); anotherForm.Show(); Application.OpenForms[anotherForm.Name]?.Focus(); 来做到这一点,并在创建记录后对其进行更新,例如

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 字段一目了然而又不可变。

1 个答案:

答案 0 :(得分:5)

您可以使用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

如果我理解正确,这就是你想要做的。

因此,您的create_cell函数可能看起来像这样:

let create_cell ~(value : 'a) : 'a cell =
  let rec c = {value; fn= (fun () -> c.value + 42)} in
  c

似乎可行:

# 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