В настоящее время я работаю с трехуровневым процессом, для которого мне нужна некоторая информация, которая будет доступна и обновляется. Информация также трехуровневая, поэтому процессу на одном уровне может потребоваться доступ / обновление информации на своем уровне и на более высоких уровнях.
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
...)