1

標準 ML で、渡された構造体のすべての機能と新しい機能を備えた構造体をファンクター出力にする方法はありますか。

同様に、複数の帰属を行うことは可能ですか?上記の場合、ファンクタの出力を元の構造のシグネチャと新しい機能を指定する別のシグネチャの両方に帰することができるため、すぐに役立ちます。

そのようなことをすることの意味と、それが悪い考えである理由を理解しています。現在、渡された構造体のコピーをファンクター出力内に保持しているだけですが、これは、基本機能にアクセスするための「Foo.Bar.func」の長いチェーンがあることを意味します。

ありがとう

4

2 に答える 2

3

「TestUp」の署名を作成したいとします。「TEST」の内容を新しい署名に複製せずにこれを行う方法はありますか?

私があなたの質問を正しく理解しているなら、あなたはキーワードを探しています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"; *)
于 2011-09-07T13:05:33.457 に答える
2

を使用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"
);
于 2011-08-14T20:35:41.543 に答える