Статически «расширять» тип данных типа записи без проблем с косвенным обращением

В настоящее время я работаю с трехуровневым процессом, для которого мне нужна некоторая информация, которая будет доступна и обновляется. Информация также трехуровневая, поэтому процессу на одном уровне может потребоваться доступ / обновление информации на своем уровне и на более высоких уровнях.

type info_0 = { ... fields ... }
type info_1 = { ... fields ... }
type info_2 = { ... fields ... }

fun0 выполнит некоторые действия с помощью info_0 , затем передаст его fun1 вместе с info_1 , затем вернет полученный ] info_0 и продолжайте, вызывая другой fun1 с другим info_1 . То же самое происходит на нижнем уровне.


В моем текущем представлении

type info_0 = { ... fields ... }
type info_1 = { i0: info_0; ... fields ... }
type info_2 = { i1: info_1; ... fields ... }

В fun2 обновление info_0 становится довольно беспорядочным:

let fun2 (i2: info_2): info_2 =
  {
    i2 with
      i1 = {
        i2.i1 with
          i0 = update_field0 i2.i1.i0
      }
  }

Что-то попроще:

type info_0 = { ... fields ... }
type info_1 = { ... fields ... }
type info_2 = { ... fields ... }
type info_01 = info_0 * info_1
type info_012 = info_0 * info_1 * info_2

let fun2 (i0, i1, i2): info_012 =
  (update_field0 i0, i1, i2)

Хорошо ли выглядит последнее решение?

Есть ли еще лучшее решение этой проблемы? (например, тот, где я мог бы написать функцию, которая может обрабатывать обновление field0 , независимо от того, имеет ли он дело с info_0 , info_1 или info_2 )

Помогут ли модули OCaml? (Я мог бы, например, включить Sig0 в Sig1 ...)

14
задан pad 25 October 2012 в 18:43
поделиться