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

StackOverflow https://stackoverflow.com/questions/680606

  •  22-08-2019
  •  | 
  •  

Вопрос

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

Я упускаю здесь что-то очень простое?

Это было полезно?

Решение

'пусть рек...и..." - это синтаксис, который вы ищете.

let rec F() = 
    G()
and G() =
    F()

Смотрите также Приключения в корекурсии F#.

Другие советы

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

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

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

F # 4.1 вводит взаимно рекурсивные модули и пространства имен.

Они являются альтернативой and ключевое слово.

module rec PingPong = // <------ rec keyword here.

    let pong() = 
        printfn "pong"
        ping() 

    let ping () = 
        printfn "ping"
        pong()

В rec ключевое слово определяет модули и пространства имен, которые "позволяют всему содержащемуся коду быть взаимно рекурсивным".

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top