3

次のファンクターがある場合、どうすればそれをインスタンス化できますListMapFnか?

functor G(M: ORD_MAP where type Key.ord_key = string) :
4

2 に答える 2

5

ファンクターの構文を少し詳しく説明するために、いくつかの例を示します。

最初にいくつかの予備的な宣言を行うので、作業するものがあります。

signature FOO =
sig
  val foo : unit -> unit
end


structure FooUnit : FOO =
struct
  fun foo () = ()
end


structure FooPrint : FOO =
struct
  fun foo () = print "Foo\n"
end

今。functor FooFn (f : FOO)引数として構造体を 1 つだけ取るファンクターを作成するとき、 orを書きたくない場合はオプションですfunctor FooFn (structure f : FOO)。実際、これはファンクターが引数として 1 つの構造体を取る場合にのみ適用されます。

(* Optionally to write "structure f : FOO" as there is only one argument *)
functor FooFn (f : FOO) = struct
  val foo = f.foo
end

ただし、ファンクターが 2 つ以上の引数を取る場合は、キーワード構造体を使用することが必須です。ファンクターは、整数値など、他の引数も取ることができることに注意してください。

(* Note there is no delimiter, just a space and the structure keyword *)
functor FooFooFn (structure f1 : FOO
                  structure f2 : FOO) =
struct
  val foo1 = f1.foo
  val foo2 = f2.foo
end

また、ファンクターを適用して結果の構造を取得するときに、いくつかのオプションがあります。最初のものは簡単です。

structure f1 = FooFn (FooUnit)

ただし、これは少し「特殊なケース」です。and の部分を省略structして「インライン」と定義しているためです。end

structure f2 = FooFn (fun foo () = print "Inlined\n")

または、もう少し冗長にしてstructandendの部分を含めることもできます。ただし、ファンクターは1つの引数を取るため、これらは両方とも機能します

structure f2_1 = FooFn (struct fun foo () = print "Inlined\n" end)

ファンクターが複数の引数を取る場合、構文はいくぶん同じです。

(* Again note there is no delimiter, so we can have it on the same line *)
structure f3 = FooFooFn (structure f1 = FooUnit structure f2 = FooPrint)

順序は関係ないので、レコードに多少似ています。

(* And we can even switch the order *)
structure f4 = FooFooFn (structure f2 = FooUnit
                         structure f1 = FooPrint)
于 2013-01-25T01:26:20.627 に答える
4

何かのようなもの

structure S = G(ListMapFn(type ord_key = string; val compare = String.compare))

または、ListMapインスタンスに名前を付けたい場合:

structure ListMap = ListMapFn(type ord_key = string; val compare = String.compare)
structure S = G(ListMap)
于 2013-01-25T00:20:05.957 に答える