OCaml: цикличность между типом варианта и определением модуля - PullRequest
7 голосов
/ 18 декабря 2011

Я переключаюсь с Haskell на OCaml, но у меня есть некоторые проблемы. Например, мне нужно определение типа для регулярных выражений. Я делаю это с:

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

Элементы внутри Or находятся в наборе (RegExpSet), поэтому я определяю его следующим (а также функцию карты):

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

в строке «ИЛИ» в определении «ре».

Если я поменяю местами эти определения, то есть, если я напишу определения модулей перед определениями повторных типов, я, очевидно, получу:

Error: Unbound type constructor re

в строке "type t = re".

Как я могу решить это? Спасибо!

1 Ответ

9 голосов
/ 18 декабря 2011

Вы можете попробовать использовать рекурсивные модули . Например, следующие компиляции:

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 )
...