如何解决Ocaml中函数之间的循环依赖
我在 ocaml 中看到了一些关于循环依赖的问题,但它们都是关于类型之间的依赖。
就我而言,我有一个名为 eval
的函数。它模拟一种编造语言的解释器,需要调用如下函数:
let rec eval e r =
match e with
(* ... *)
Forall(p,s) ->
let pred = eval p r in
let set = eval s r in
forall pred s |
(* ... *)
问题是,forall
看起来像这样:
let forAll (p : exp) (s : evT) : evT =
match s with
SetVal(Empty(_)) -> (Bool true) |
SetVal(Set(lst,_)) ->
match p with
(* irrelevant code *)
match l with
[] -> acc |
h::t -> aux t ((eval (FunCall(p,(evTToExp h))) env0)::acc)
in
(* irrelevant code *)
如您所见,它既需要被调用,也需要调用 eval
。
如果我将 eval
的定义放在我的 .ml 文件中,我得到 Unbound value forall
,否则我得到 Unbound value eval
。
如何解决这种依赖?我如何让 ocaml 知道它会在文件的其他地方找到缺失函数的定义?
解决方法
通过 rec
和 and
关键字实现相互递归:
let rec eval = ...
and forAll = ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。