2011-12-18 24 views
7

私はHaskellからOCamlに切り替わりますが、いくつかの問題があります。たとえば、正規表現の型定義が必要です。それとも内部の要素がセット(RegExpSet)であるので、私はそれが次の(ともマップ機能)を定義OCaml:バリアント型とモジュール定義の間の循環性

type re = EmptySet 
    | EmptyWord 
    | Symb of char 
    | Star of re 
    | Conc of re list 
    | Or of (RegExpSet.t * bool) ;; 

:私はそう

module RegExpOrder : Set.OrderedType = 
    struct 
     let compare = Pervasives.compare 
     type t = re 
    end 
module RegExpSet = Set.Make(RegExpOrder)  
module RegExpMap = Map.Make(RegExpOrder) 

しかし、私が行うとき"ocaml [ファイル名]"を取得しました。

Error: Unbound module RegExpSet 

"re"の定義の行にあります。

私はこれらの定義を交換した場合、それは私が再型定義の前にモジュールの定義を記述する場合、私は明らかに取得するには、次のとおりです。「型t =再」の行で

Error: Unbound type constructor re 

を。

どうすればこの問題を解決できますか? ありがとう!

答えて

9

recursive modulesを試すことができます。たとえば、次のようにコンパイルします。

module rec M : 
sig type re = EmptySet 
    | EmptyWord 
    | Symb of char 
    | Star of re 
    | Conc of re list 
    | Or of (RegExpSet.t * bool) 
end = 
struct 
    type re = EmptySet 
    | EmptyWord 
    | Symb of char 
    | Star of re 
    | Conc of re list 
    | Or of (RegExpSet.t * bool) ;; 
end 

and RegExpOrder : Set.OrderedType = 
    struct 
     let compare = Pervasives.compare 
     type t = M.re 
    end 
and RegExpSet : (Set.S with type elt = M.re) = Set.Make(RegExpOrder) 
+0

お返事ありがとうございます!私はその定義をファイルの先頭に追加しました。しかし今、私は新しい型の問題を抱えています。これは、関数の引数をタイプM.reの要素でパターンマッチングすることを試みるときです。たとえば、この関数 をlf exp = と一致させるには、 \tと一致させます。M.EmptyWord - > M.EmptySet ;;未結合のコンストラクタ抽象行われたre' M.EmptyWord ヒカルド・アルメイダ – vegetus

+0

型の実装 ': は私 エラーが発生します。モジュール署名 'sig type re end'を削除してみてください。また、隠蔽の中間レベルを可能にする 'private'型も見てください。モジュールの外側では 're'型の値を取得するために特別なコンストラクタを使用する必要がありますが、パターンマッチングは可能です。 –

+0

@ user1104586 'M.re'のコンストラクタを可視にするために私の答えを更新しました。 –

関連する問題