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