OCaml: объявление функции перед ее определением - PullRequest
10 голосов
/ 30 сентября 2011

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

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

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

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

Хотя это не работает, так как myFunctionA не может вызвать myFunctionB, пока это не сделано.

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

Ответы [ 2 ]

22 голосов
/ 30 сентября 2011

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

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

and myFunctionB = 
(* some stuff here .... *) myFunctionA (* some stuff *)
2 голосов
/ 30 октября 2011

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

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

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

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

...