OCaml: объявление функции перед ее определением

Есть ли способ объявить функцию перед ее определением в OCaml? Я использую переводчик OCaml.

У меня есть две функции:

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

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

Это не работает, так как myFunctionA не может вызвать myFunctionB до того, как это будет сделано.

Я сделал несколько поисков в Google, но, похоже, ничего не могу найти. Как я могу сделать это?

2 ответа

Решение

Вам нужно сделать эти две функции взаимно рекурсивными. Вместо использования "let ... let ...", вы должны использовать "let rec ... and ..." следующим образом:

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

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

На самом деле "let rec .." имеет очень серьезное ограничение: он работает только в пределах одного модуля. Это заставляет программиста писать большие модули там, где это нежелательно... проблема, которая не возникает в низком C!

Есть несколько обходных путей, все неудовлетворительно. Первый заключается в создании переменной типа функции и первоначальном сохранении функции, вызывающей исключение, а затем последующем сохранении нужного значения.

Во-вторых, использовать типы классов и классов (и одно косвенное). Если у вас много взаимно рекурсивных функций, это лучший способ (потому что вам нужно только передать один объект каждому из них).

Самым простым и уродливым является передача функций друг другу в качестве аргументов, решение, которое быстро выходит из-под контроля. В модуле, следуя всем определениям, вы можете упростить вызывающий код, введя набор оберток "let rec". К сожалению, это не помогает определить функции, и часто такие вызовы происходят в таких определениях.

Другие вопросы по тегам