是否有办法在OCaml中定义函数之前声明它?我正在使用OCaml解释器。
有两个函数:
let myFunctionA =
(* some stuff here..... *) myFunctionB (*some stuff *)
let myFunctionB =
(* some stuff here .... *) myFunctionA (* some stuff *)
这不起作用,因为myFunctionA在创建之前不能调用myFunctionB。
我已经做了一些谷歌搜索,但似乎找不到任何东西。我怎样才能做到这一点呢?
您需要的是使这两个函数相互递归。而不是用"let…,你必须用"Let rec…"
let rec myFunctionA =
(* some stuff here..... *) myFunctionB (*some stuff *)
and myFunctionB =
(* some stuff here .... *) myFunctionA (* some stuff *)
实际上"let rec .."有一个非常严重的限制:它只能在单个模块中工作。这迫使程序员在不需要的地方编写大模块。在低C语言中不会出现的问题!
有几个变通办法,但都不令人满意。第一种方法是创建一个函数类型的变量,并首先在其中存储引发异常的函数,然后存储所需的值。
第二个是使用类类型和类(和一个间接)。如果你有很多相互递归的函数,这是最好的方法(因为你只需要传递一个对象给每个函数)。
最简单也是最丑陋的方法是将函数作为参数相互传递,这种解决方案很快就会失控。在遵循所有定义的模块中,您可以通过引入一组"let rec"包装器来简化调用代码。不幸的是,这并不能帮助定义函数,而且通常大多数调用都发生在这样的定义中。