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

时间:2011-09-30 16:50:54

标签: function functional-programming ocaml function-declaration mutual-recursion

在OCaml中定义函数之前有没有办法声明函数?我正在使用OCaml解释器。

我有两个功能:

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

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

这不起作用,因为myFunctionA在制作之前无法调用myFunctionB。

我做了一些谷歌搜索,但似乎找不到任何东西。我怎么能做到这一点?

2 个答案:

答案 0 :(得分:22)

你想要的是使这两个函数相互递归。而不是使用“let ... let ...”,你必须使用“let rec ... and ...”,如下所示:

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

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

答案 1 :(得分:2)

实际上“让rec ..”有一个非常严重的限制:它只能在一个模块中运行。这迫使程序员在不需要的地方编写大模块。这个问题在低级C中不会发生!

有几种解决方法,都不尽如人意。第一个是创建函数类型的变量,并且最初存储一个在其中引发异常的函数,然后存储所需的值。

第二种是使用类类型和类(以及一个间接)。如果你有很多相互递归的函数,这是最好的方法(因为你只需要将一个对象传递给它们)。

最简单,最丑陋的是将函数作为参数传递给对方,这是一种快速失控的解决方案。在遵循所有定义的模块中,您可以通过引入一组“let rec”包装器来简化调用代码。不幸的是,这无助于定义函数,并且通常大多数调用都会出现在这样的定义中。