OCaml では、シグネチャをネストできます:
module type FOO =
sig
module type BAR
(* … *)
end
必要な場所が思いつかないので、誰かがこれを使用している例を持っているかどうか疑問に思っていました. おそらくファンクタのリターン シグネチャで役立つと思いますが、具体的なことは思いつきません。
いくつかのモジュール(おそらくバッテリー内)を見たことを思い出します。そのInfix
中には、本当に必要な場合にのみ個別に開くことができるモジュールが含まれていました。例えば、
module Rational =
struct
let add a b = ...
let sub a b = ...
module Infix =
struct
let (<+>) = add
let (<->) = sub
end
end
このように、Rational.Infix
モジュールを開いた場合、内の何かと同じ名前の関数のスコープを解除(?)することはありませんRational
。
モジュールを使用して境界を定めるプロジェクトに取り組んでいますtypes
。モジュールに1つのタイプのみを定義させ、そのタイプを操作することは組織化に役立ちます。特にモジュールが小さく、個別のファイルを持つことは有利ではなく、バリアントタイプは意味がありません。
module Node =
struct
end
module Edge =
struct
end
type 'a tree = { nodes : 'a Node.t; edges : 'a Edge.t; }
また、これらを個別のファイル(-mlpackと組み合わせて)として使用しますが、生物学的データに必要なすべてのパーサー(Nexus、Fasta、Phylipなど)に使用します。
最後に、多くの場合、新しいアルゴリズムをプロトタイプ化するときは、最初にそれをocamlで記述し、次にCバージョンで作業します。私たちは通常、同じ関数名を持つ内部モジュールにocamlバージョンを保持します。
module Align =
struct
module OCaml =
struct
end
end
私の頭に浮かんだ最初の例:http://caml.inria.fr/pub/docs/manual-ocaml/libref/type_Map.html
(それは確かにファンクターの署名です)