次のファンクターがある場合、どうすればそれをインスタンス化できますListMapFn
か?
functor G(M: ORD_MAP where type Key.ord_key = string) :
次のファンクターがある場合、どうすればそれをインスタンス化できますListMapFn
か?
functor G(M: ORD_MAP where type Key.ord_key = string) :
ファンクターの構文を少し詳しく説明するために、いくつかの例を示します。
最初にいくつかの予備的な宣言を行うので、作業するものがあります。
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")
または、もう少し冗長にしてstruct
andend
の部分を含めることもできます。ただし、ファンクターは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)
何かのようなもの
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)