OCaml: 在定义函数之前声明函数

12
有没有在OCaml中声明函数但未定义的方法?我正在使用OCaml解释器。
我有两个函数:
let myFunctionA = 
(* some stuff here..... *) myFunctionB (*some stuff *)

let myFunctionB = 
(* some stuff here .... *) myFunctionA (* some stuff *)

然而这并不奏效,因为 myFunctionA 在 myFunctionB 之前无法调用。

我已经进行了几次谷歌搜索,但似乎找不到任何东西。我该如何完成这个任务?


OCaml核心递归函数。请参见《有关OCaml的注释:相互递归函数》(http://www.csc.villanova.edu/~dmatusze/resources/ocaml/ocaml.html#Mutually%20recursive%20functions)。 - user166390
1
我不能说我曾经听说过相互递归被称为共递归 - 虽然,很明显知道意思是什么。 - nlucaroni
2个回答

26

你想要的是使这两个函数相互递归。你需要使用"let rec ... and ..."来代替"let ... let ...",具体如下:

let rec myFunctionA = 
(* some stuff here..... *) myFunctionB (*some stuff *)

and myFunctionB = 
(* some stuff here .... *) myFunctionA (* some stuff *)

2
实际上,“let rec…”有一个非常严重的限制:它只在单个模块中起作用。这迫使程序员编写不需要的大型模块...这是低级C语言中不存在的问题!
有几种解决方法,但都不尽如人意。第一种方法是将函数类型的变量初始化为引发异常的函数,然后稍后存储所需值。
第二种方法是使用类类型和类(以及一次间接引用)。如果您有很多相互递归的函数,则这是最好的方法(因为您只需要向它们中的每个函数传递一个对象)。
最简单且最丑陋的方法是将函数作为参数传递给彼此,这种解决方案会迅速失去控制。在定义后面的模块中,您可以通过引入一组“let rec”包装器来简化调用代码。不幸的是,这并不能帮助定义函数,并且通常大多数调用都会出现在这些定义中。

请注意,现在通过递归模块已经有所缓解,例如像这样:https://dev59.com/r5Dea4cB1Zd3GeqPfLAA#33482273。然而,它仍然相当笨拙。 - antron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接