Ответ 1
'let rec... и...' - это синтаксис, который вы ищете.
let rec F() =
G()
and G() =
F()
См. также Приключения в F # Co-Recursion.
Я немного смущен тем, как получить два метода для вызова друг друга (т.е. иметь A()
вызов B()
и B()
вызов A()
)). Похоже, что F # только "видит" метод после того, как он встречается в коде, поэтому, если он этого не сделал, он просто говорит, что значение или конструктор не определено.
Я пропустил что-то очень основное здесь?
'let rec... и...' - это синтаксис, который вы ищете.
let rec F() =
G()
and G() =
F()
См. также Приключения в F # Co-Recursion.
Поскольку вопрос касается методов, а ответ Брайана - о функциях, возможно, полезно указать, что вы можете использовать аналогичный синтаксис для типов:
type A() =
let b = new B()
member x.MethodA() = b.MethodB()
and B() =
member x.MethodB() = ()
Обратите внимание также, что члены "let rec" по умолчанию (на самом деле я не думаю, что они могут быть не рекурсивными).
let rec a () = b ()
and b () = ()
Это взаимно рекурсивные функции.
type T () =
member t.A () = t.B()
member t.B () = ()
Это тривиально; он просто работает. Обратите внимание на комментарий Абеля.
type TypeA () =
member t.A (b : TypeB) = b.B()
and TypeB () =
member b.B () = ()
Здесь используется синтаксис type ... and
для взаимно-рекурсивных типов.
Обычно and
используется, только если вызовы происходят в обоих направлениях. В противном случае может быть лучше переупорядочить объявления так, чтобы вызываемая функция была первой. Часто бывает полезно, чтобы тип-вывод и читаемость избегали циклических зависимостей и не подразумевали их там, где они не используются.
Я предлагаю отредактировать вопрос либо для запроса функций в целом, либо для запроса разных типов (в этом случае я удалю первые два случая из этого ответа). Обычно методы рассматриваются как подмножество функций, являющееся общим математическим термином. Тем не менее, все функции F # являются технически CLI-методами, так как они скомпилированы. Как есть, неясно, что задает вопрос, но из принятого ответа я предполагаю, что он не только запрашивает методы, как это подразумевает заголовок.