1
モジュール/ファンクタを使用してより汎用的なコード設計をしようとしています。簡素化するために、私は2つのインターフェイスがあります。ocamlのモジュール/ファンクタシグネチャの制約としてのバリアント型
module type T1 = sig type t end;;
module type T2 = sig type t end;;
をし、私はそうT1.t
に基づいてバリアント型でT2.t
をインスタンス化したいと思います。しかし
Unbound module X
Syntax error inside `module' after unclosed (, expected `.'
私は多相バリアントを使用している場合、受け入れられているようだ:
module OK2 (T: T1) : (T2 with type t = [ `X | `Y of T.t]) = struct
type t = [ `X | `Y of T.t ]
end
が、私ははっきりしません
(* simple example, this one is accepted *)
module OK (T: T1) : (T2 with type t = T.t) = struct type t = T.t end;;
(* using a variant type, this one is rejected *)
module KO (T: T1) : (T2 with type t = X | Y of T.t) = struct
type t = X | Y of T.t
end
は後者では、私は、次のエラーを取得します理由を理解する。 バリアントでこのような制約を使用する正しい方法は何ですか?
PS:この1つは、モジュールの制約with type t = ...
で
module OK2 (T: T1) : (T2 with type t = [ `X | `Y of T.t]) = struct
type t = X | Y of T.t
end
かもしれ書きたい何
は、私はそれに見てみます、ありがとうございます。私は、正常/多型の変種に関する情報のいくつかの情報源を見つけましたが、どれが最新のものかを見ることは困難です。あなたにはお勧めするものがありますか? – Vinz
OCamlのマニュアルは、最新の情報を得るための最終的な情報源です:https://caml.inria.fr/pub/docs/manual-ocaml/lablexamples.html#sec46 – glennsl
彼らは賛否両論あり、彼らが両方の言語で存在する理由です。不明な場合は、通常のバリアントに固執します。 – camlspotter