在某些编程语言中,尤其是在 C 语言中,有带有函数声明的头文件。这些函数“标头”位于代码之前,在相互递归的情况下是必需的。将函数头放在头文件中时,它们还有助于链接多个 C 文件一起编译的情况。
我对 C 文件中的函数头的理解是它们有助于编译,因为它们定义了函数的类型(如果在定义之前调用它)。如果这是错误的,我很乐意接受纠正和更好的了解,但这是我对它的理解。
所以我不明白的是,为什么其他语言——在这种情况下我选择 OCaml——没有函数头。在 OCaml 中,有带有签名的模块,但签名不允许您的函数实例相互递归,即使给出了类型。为了在 OCaml 中实现相互递归,您需要使用“and”关键字,或者在另一个函数中本地定义一个函数(据我所知)。
(* version 1 *)
let rec firstfun = function
| 0 -> 1
| x -> secondfun (x - 1)
and secondfun = function
| 0 -> 1
| x -> firstfun x
(* version 2 *)
let rec firstfun = function
| 0 -> 1
| x ->
let rec secondfun = function
|0 -> 1
| x -> firstfun x in
secondfun (x - 1)
那么为什么会这样呢?它与多态性有关吗?是否存在我没有考虑的编译瓶颈?