Расширение структуры функторов и множественное присвоение в SML - PullRequest
0 голосов
/ 13 августа 2011

Есть ли способ в Standard ML, чтобы заставить функтор выводить структуру, которая имеет все функциональные возможности переданной структуры, плюс любые новые функциональные возможности.

Аналогичным образом, возможно ли сделатьмножественная надпись?В случае вышеупомянутого это было бы немедленно полезно, потому что вы могли бы приписать выходные данные функтора как сигнатуре исходной структуры, так и другой сигнатуре, которая определяет новую функциональность.вещь, и почему это может быть плохой идеей.В настоящее время я просто храню копию переданной структуры в выводе функтора, но это означает, что у вас есть длинная цепочка «Foo.Bar.func» для доступа к базовой функциональности.

Спасибо

Ответы [ 2 ]

3 голосов
/ 07 сентября 2011

Скажем, я хотел сделать подпись для "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"; *)
1 голос
/ 15 августа 2011

Вы можете использовать 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"
);
...