OCaml: цикличность между типом варианта и определением модуля
Я переключаюсь с 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
в строке типа t = re.
Как я могу решить это? Спасибо!
1 ответ
Решение
Вы можете попробовать использовать рекурсивные модули. Например, следующие компиляции:
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 )