Расширение структуры функторов и множественное присвоение в SML
Есть ли способ в Standard ML, чтобы заставить функтор выводить структуру, которая имеет все функциональные возможности переданной в структуре, плюс любые новые функциональные возможности.
Подобным образом, возможно ли сделать множественную приписку? В случае вышеупомянутого это было бы немедленно полезно, потому что вы могли бы приписать выходные данные функтора как сигнатуре исходной структуры, так и другой сигнатуре, которая определяет новую функциональность.
Я понимаю последствия подобных действий и почему это может быть плохой идеей. В настоящее время я просто храню копию переданной структуры в выводе функтора, но это означает, что у вас есть длинная цепочка "Foo.Bar.func" для доступа к базовой функциональности.
Спасибо
2 ответа
Скажем, я хотел сделать подпись для "TestUp". Есть ли способ сделать это, не дублируя содержимое "ТЕСТ" в новую подпись?
Если я правильно понимаю ваш вопрос, то вы ищете include
ключевое слово, которое будет включать определение предыдущей подписи в новую и, таким образом, расширять подпись предыдущими определениями.
signature TEST_EXT =
sig
include TEST
val beep1 : meep -> unit
end
functor TestUp_EXT(T : TEST) : TEST_EXT =
struct
open T
fun localFun s = beep (10, s)
val beep1 = localFun
end
structure Test2_EXT = TestUp_EXT (Test);
Test2_EXT.beep (5, "EXT: Hi");
Test2_EXT.beep1 "Hi";
print (Int.toString (Test2.rand ()) ^ "\n");
(* This will fail as the signature doesn't define this function,
however as seen the function can easily be used within the functor as
expected *)
(* Test2_EXT.localFun "Hi"; *)
Ты можешь использовать open
перенести содержимое структуры в текущую область. Если его использовать внутри другой структуры (или функтора), он будет делать то, что я считаю, что вы хотите.
Пример можно увидеть здесь:
signature TEST =
sig
type meep;
val beep : int * meep -> unit;
end;
structure Test : TEST =
struct
type meep = string
fun beep (0, _) = ()
| beep (n, s) = (print (s^"\n"); beep (n-1, s));
end;
functor TestUp (T : TEST) =
struct
open T
fun rand () = 4
end;
structure Test2 = TestUp (Test);
Test.beep (5, "Hello");
Test2.beep (5, "Hi");
print (
Int.toString (Test2.rand ()) ^ "\n"
);