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