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