Я не думаю, что есть способ достичь этого в F #. Обычно можно структурировать приложение так, чтобы этого не требовалось, поэтому, возможно, если вы описали свой сценарий, вы можете получить несколько полезных комментариев.
В любом случае, существуют различные способы обойти проблему - вы можете объявить запись или интерфейс для хранения функций, которые вам нужно экспортировать из модуля. Интерфейсы позволяют также экспортировать полиморфные функции, поэтому они, вероятно, являются лучшим выбором:
// Before the declaration of modules
type Module1Funcs =
abstract Foo : int -> int
type Module2Funcs =
abstract Bar : int -> int
Модули могут затем экспортировать значение, которое реализует один из интерфейсов, и функции, которые требуют, чтобы другой модуль мог принять его в качестве аргумента (или вы можете сохранить его в изменяемом значении).
module Module1 =
// Import functions from Module2 (needs to be initialized before using!)
let mutable module2 = Unchecked.defaultof<Module2Funcs>
// Sample function that references Module2
let foo a = module2.Bar(a)
// Export functions of the module
let impl =
{ new Module1Funcs with
member x.Foo(a) = foo a }
// Somewhere in the main function
Module1.module2 <- Module2.impl
Module2.module1 <- Module1.impl
Инициализация также может быть выполнена автоматически с использованием Reflection, но это немного уродливо, однако, если вам действительно это нужно часто, я мог бы представить для этого какую-нибудь библиотеку многократного использования.
Во многих случаях это кажется немного уродливым, и реструктуризация приложения, чтобы избежать рекурсивных ссылок, является лучшим подходом (фактически, я нахожу рекурсивные ссылки между классами в объектно-ориентированном программировании, часто довольно запутывающими). Однако, если вам действительно нужно что-то подобное, то экспорт функций с использованием интерфейсов / записей, вероятно, является единственным вариантом.