У меня вопрос о том, как лучше поступить следующим образом:
У меня есть класс B, у меня есть комбинатор на B, пусть foo: B -> int.
IЯ хочу, чтобы в классе B комбинатор был инкапсулирован как метод, поэтому я добавляю его с расширением типа.
Позже я потом осознаю, что foo довольно дорогой, и хочу кешировать его результат с помощью отложенной оценки
Поэтому я добавляю в систему огромное сцепление, передавая комбинатор как функцию конструктору, а затем инициализируя поле с помощью foo = lazy (foo self) в конструкторе.
т.е.
type foo =
class
val x : int Lazy
new (comb) as self = {x=lazy(comb self);}
end
let something (x:foo) = 1
type foo with
new() = foo(something)
это, очевидно, кажется неправильным
две опции, которые я вижу для исправления этого: 1, сделать интерфейс и иметь foo наследовать этот интерфейс, 2, сделать все статическим методом и затем сделать из них комбинаторыстатические методы (вроде противоположности их присоединения к классам ...)
Ни один из них не очень привлекателен, и мне было интересно, пропустил ли я опцию 3
О, и у меня нетбылов состоянии получить let rec и работать с этим совершенно правильно, и я бы не хотел, чтобы «что-то» в вышеприведенном утверждении зависело от функции, которая зависит от функции, которая зависит от функции (глубиной 3).
любой совет был бы оценен