используя поле записи в другом поле той же записи - PullRequest
0 голосов
/ 30 октября 2018

Интересно, возможно ли в 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 Ответ

0 голосов
/ 30 октября 2018

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...