在同一记录的其他字段中使用记录字段
using record field in other field of the same record
我想知道在 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
字段不可变且一次性。
您可以使用 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
我想知道在 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
字段不可变且一次性。
您可以使用 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