我从Haskell切换到OCaml,但我遇到了一些问题。例如,我需要正则表达式的类型定义。我这样做:
type re = EmptySet
| EmptyWord
| Symb of char
| Star of re
| Conc of re list
| Or of (RegExpSet.t * bool) ;;
Or中的元素在一个集合(RegExpSet)中,所以我接下来定义它(以及一个map函数):
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"的定义中。
如果我交换这些定义,也就是说,如果我在re类型定义之前编写模块定义,我显然会得到:
Error: Unbound type constructor re
在"行中输入t = re"。
我该如何解决这个问题? 谢谢!
答案 0 :(得分: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 )