在同一记录中使用记录字段于其他字段的方法

3

我想知道在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

我在想是否可能在不改变fn字段的可变性的情况下一次完成。
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接