2017-12-14 22 views
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 

答えて

2

を拒否されることに注意してください、あなたは型定義を記述しますが、式を入力することはできません。

X | Y of T.tは、バリアント型定義のrhsであるため、構文エラーとして拒否されます。一方、[ `X | `Y of T.t]はタイプ式です。

通常の変異型と多型の違いがわからない場合は、OCamlの書籍またはリファレンスマニュアルを確認してください。あなたは

module type T3 = sig 
    type t' 
    type t = X | Y of t' 
end 

module KOX (T: T1) : (T3 with type t' := T.t) = struct 
    type t = X | Y of T.t 
end 
+0

かもしれ書きたい何

は、私はそれに見てみます、ありがとうございます。私は、正常/多型の変種に関する情報のいくつかの情報源を見つけましたが、どれが最新のものかを見ることは困難です。あなたにはお勧めするものがありますか? – Vinz

+1

OCamlのマニュアルは、最新の情報を得るための最終的な情報源です:https://caml.inria.fr/pub/docs/manual-ocaml/lablexamples.html#sec46 – glennsl

+0

彼らは賛否両論あり、彼らが両方の言語で存在する理由です。不明な場合は、通常のバリアントに固執します。 – camlspotter

関連する問題