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