Types OCAML混淆了定义的类型和定义?

Types OCAML混淆了定义的类型和定义?,types,ocaml,typing,as-pattern,Types,Ocaml,Typing,As Pattern,我正在做一项任务,将正则表达式转换为NFA,并在OCAML中将NFA转换为DFA。为了单独测试每个“函数”,我一直在一个单独的文件中编写代码,但在使用as模式时遇到了一个问题 NFA定义: (* Imports not shown. *) let sidx = ref 0 let new_state() = sidx := !sidx + 1; !sidx type state = int type states = state BatSet.t type delta = (state *

我正在做一项任务,将正则表达式转换为NFA,并在OCAML中将NFA转换为DFA。为了单独测试每个“函数”,我一直在一个单独的文件中编写代码,但在使用as模式时遇到了一个问题

NFA定义:

(* Imports not shown. *)

let sidx = ref 0
let new_state() = sidx := !sidx + 1; !sidx

type state = int
type states = state BatSet.t 
type delta = (state * alphabet, state BatSet.t) BatMap.t 
type e_delta = (state, state BatSet.t) BatMap.t
type final = state BatSet.t
type init = state

(* ... *)

type t = states * delta * e_delta * init * final 

(* create a new NFA with a single start state *)
let create_new_nfa () = 
   let is = new_state () in
      (BatSet.singleton is, BatMap.empty, BatMap.empty, is, BatSet.empty)

(* ... More Function(s) Not Shown.*)
当我自己编译下面的代码时(也就是说,我不使用make文件,而是手动键入compile命令输入),我没有问题,它的工作方式也与假定的一样:

let regex2nfa : Regex.t -> Nfa.t
=fun regex ->
        let ((state, delta, e_delta, init, final) as nfa) = Nfa.create_new_nfa () in (*Line 9*)
        nfa
但当我使用他们的make文件时,它抱怨说:

这没有任何意义Nfa.t属于以下类型:

“a*'b*'c*'d*'e

如其声明所示:

type t = states * delta * e_delta * init * final
如果我取出那个元组,将名称“nfa”分配给create_new_nfa函数的输出,那么它编译得很好,但这到底是为什么呢


作为参考,make文件可以找到

Nfa.t
作为一个in
Nfa.mli
公开,因此在
Nfa
模块之外,不允许您假设它是一个5元组。您的
as
-模式正是这样做的,这就是它被拒绝的原因

(错误消息肯定会更有帮助。)

抽象类型是OCaml中的一种信息隐藏功能,它允许模块的作者防止第三方代码依赖其实现的细节


但是等等,为什么您的代码要在顶层编译?我不确定,但我怀疑您做了类似于
#use
ing
nfa.ml
,这将绕过
nfa.mli
,并允许您对
nfa.t
类型的内部进行假设

作为旁注,使OP的代码更清晰(imho)的一种方法是将
Nfa.t
定义为记录而不是元组。@RichouHunter这是我的家庭作业,因此我无法控制修改Nfa代码。我只需要与它交互,并将其相应地用于不同的任务。但是谢谢你的提示,如果我将来创建任何类型,我会查看记录,例如。@DanHoynoski,告诉你的老师他们可以改进代码!:P