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