Расширение структуры функторов и множественное присвоение в 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"
);
Другие вопросы по тегам