Очень часто бывает дорого вычислять свойство из значения. Таким образом, было бы лучше иметь возможность хранить свойство после его вычисления. Мне интересно, как правильно это кодировать.Модуль с магазином
Приведем пример. Предположим, у нас есть целочисленный тип, и очень часто нам нужно вычислить простые множители значения такого типа (давайте предположим, простые множители отрицательного целого числа None
):
module I =
struct
type t = C of int
type pf = (int list) option
let calculate_prime_factors (x: t) : pf =
(* a costly function to calculate prime factors *)
... ...
let get_prime_factors (x: t) : pf =
calculate_prime_factors x
end
let() =
let v = I.C 100 in
let pf_1 = I.get_prime_factors v in
let pf_2 = I.get_prime_factors v in
let pf_3 = I.get_prime_factors v in
...
На данный момент get_prime_factors
просто вызывает calculate_prime_factors
, как следствие, все вычисления pf_1
, pf_2
, pf_3
занимают много времени. Я хотел бы иметь механизм, позволяющий хранить основные факторы внутри модуля, так что, пока целое число не изменяется, второе и третье время get_prime_factors
просто читают то, что было сохранено.
Кто-нибудь знает, как изменить модуль I
, чтобы достичь этого?
Возможно, нам нужны ссылки, чтобы сделать возможным этот механизм (например, let vr = ref (I.C 100) in ...
). Это нормально для меня использовать ссылки. Но я не знаю, как автоматически запускать calculate_prime_factors
, если изменяется значение удержания (то есть !vr
).
Спасибо за ваше решение, в котором хранится пара целых чисел и их первичные факторы снаружи. Он должен работать, но я скорее ищу механизм, который сохраняет результат внутри модуля ... – SoftTimur
Я не понимаю, что вы имеете в виду. Вы можете поместить 'my_storage' в модуль. –
Я пытаюсь найти решение с типом записи '{v: t; pf: pf} 'внутри модуля' I'. Таким образом, целое число 'v' и его первичные коэффициенты' pf' всегда хранятся вместе. Вот что я подразумеваю под «внутри модуля» ... – SoftTimur