Мне бы очень хотелось услышать об общем подходе, это не относится к Hashtbl
Основная проблема, которую вы пытаетесь решить, состоит в том, чтобы взять изменяемую структуру данных и обращаться с ней как с неизменяемой . Тот факт, что это происходит при создании новой записи, - это красная сельдь. (Хотя я укажу, что, поскольку вы создаете запись, в которой каждое поле отличается, old_rec with
является излишним и отвлекающим.)
Общим решением для обработки изменяемой структуры данных, как если бы она была неизменной, было copy, затем mutate . Но это решение чревато опасностью:
При точно неясно, при каких обстоятельствах достаточно мелкой копии или когда вам, возможно, придется написать глубокую копию.
Если абстракция изменчива, нет гарантии, что даже предлагает операцию копирования (или соответствующую операцию копирования).
Копии могут быть дорогими, особенно глубокие копии.
Именно эти соображения и побуждают людей избегать изменчивого состояния. Я понимаю, что это трудно сделать в Caml, потому что стандартные библиотеки необычайно необходимы для функционального языка. Тем не менее, я считаю, что правильная «общая» стратегия в долгосрочной перспективе заключается в замене изменчивых абстракций чисто функциональными структурами данных .
Приложение: Вот пример для хеш-таблиц:
let extend key val tbl =
let h = Hashtbl.copy tbl in
let _ = Hashtbl.replace tbl key val in
h
Если Hashtbl.copy
достаточно глубоко, вы можете использовать это как функциональный способ расширения хеш-таблицы. Но тебе лучше с красно-черными деревьями.