【发布时间】:2017-03-31 01:42:55
【问题描述】:
我正在处理一项将正则表达式转换为 NFA 以及在 OCAML 中将 NFA 转换为 DFA 的任务。我一直在一个单独的文件中编写我的代码,以便单独测试每个“功能”,但是在使用 as-pattern 时遇到了一个问题。
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 文件,而是手动键入编译命令输入),我没有问题,它也像假设的那样工作:
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
这没有任何意义。 Nfa.t 的类型为:
'a * 'b * 'c * 'd * 'e
如其声明所示:
type t = states * delta * e_delta * init * final
如果我取出那个元组并将名称“nfa”分配给 create_new_nfa 函数的输出,那么它编译得很好,但究竟为什么这是怎么回事?
供参考,make文件可以在here找到
【问题讨论】:
标签: types ocaml typing as-pattern