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

Posted

技术标签:

【中文标题】OCaml:在定义之前声明一个函数【英文标题】:OCaml: Declaring a function before defining it 【发布时间】:2011-11-28 15:19:24 【问题描述】:

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

我有两个功能:

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

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

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

我已经进行了几次谷歌搜索,但似乎找不到任何东西。我怎样才能做到这一点?

【问题讨论】:

相关关键字:“ocaml corecursive function”。见Notes on OCaml: Mutually Recursive Functions。 我不能说我听说过协同递归来暗示相互递归——尽管它的含义很明显。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

有几种解决方法,都不能令人满意。首先是创建一个函数类型的变量,并最初存储一个引发异常的函数,然后存储所需的值。

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

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

【讨论】:

请注意,这现在通过递归模块有所缓解,例如:***.com/a/33482273/2482998。然而,这仍然很尴尬。

以上是关于OCaml:在定义之前声明一个函数的主要内容,如果未能解决你的问题,请参考以下文章

OCaml 用户定义类型和函数返回错误

可以在 OCaml 中的类型之间编码二进制函数吗?

ocaml 中的匹配是不是调用构造函数?

如何解决这个 Ocaml 字典问题?

初始化变量OCaml

为啥 `id id` 在 OCaml 中不是一个值?