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". К сожалению, это не помогает определить функции, и часто такие вызовы происходят в таких определениях.