Как использовать два метода вызова друг друга?

Я немного смущен тем, как получить два метода для вызова друг друга (т.е. иметь A() вызов B() и B() вызов A())). Похоже, что F # только "видит" метод после того, как он встречается в коде, поэтому, если он этого не сделал, он просто говорит, что значение или конструктор не определено.

Я пропустил что-то очень основное здесь?

Ответ 2

Поскольку вопрос касается методов, а ответ Брайана - о функциях, возможно, полезно указать, что вы можете использовать аналогичный синтаксис для типов:

type A() =
    let b = new B()
    member x.MethodA() = b.MethodB()
and B() =
    member x.MethodB() = ()

Обратите внимание также, что члены "let rec" по умолчанию (на самом деле я не думаю, что они могут быть не рекурсивными).

Ответ 3

Функции, объявленные через let

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