Frage

Ich bin ein wenig verwirrt, wie zwei Verfahren, um sie zu nennen (das heißt, A() Anruf B() und B() Anruf A() hat). Es scheint, dass F # nur ‚sieht‘ das Verfahren, nachdem es in Code angetroffen worden ist, also wenn es nicht hat, sagt es nur Wert oder Konstruktor nicht definiert wurde .

Fehle ich etwas sehr einfach hier?

War es hilfreich?

Lösung

'lassen rec ... und ...' ist die Syntax, die Sie suchen.

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

Siehe auch Adventures in F # Co -Recursion .

Andere Tipps

Da die Frage nach Methoden ist, und Brians Antwort ist über Funktionen, vielleicht ist es sinnvoll, darauf zu hinweisen, dass Sie eine ähnliche Syntax für Typen verwenden können:

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

Beachten Sie auch, dass Mitglieder ‚lassen rec‘ standardmäßig (in der Tat glaube ich nicht, können sie nicht rekursiv sein).

F # 4.1 einleitet gegenseitig rekursive Module und Namensräume .

Es handelt sich um eine Alternative zum and Schlüsselwort.

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

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

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

Das rec Schlüsselwort definiert Module und Namespaces, die „ermöglichen alle enthaltenen Code für beide Seiten rekursiv zu sein.“

Funktionen über let deklariert

let rec a () = b ()
and b () = ()

Dies sind für beide Seiten rekursiven Funktionen .

Methoden innerhalb des gleichen Typs

type T () =
    member t.A () = t.B()
    member t.B () = ()

Dies ist trivial; es funktioniert einfach. Hinweis Abels Kommentar though.

Methoden innerhalb verschiedenen Typen

type TypeA () =
    member t.A (b : TypeB) = b.B()

and TypeB () =
    member b.B () = ()

Dies verwendet die type ... and Syntax für für beide Seiten rekursive Typen .

Notizen

Normalerweise and wird nur verwendet, wenn die Anrufe in beiden Richtungen auftreten. Andernfalls kann es besser sein, die Erklärungen neu zu ordnen, so dass die genannte Funktion zuerst kommt. Es ist oft hilfreich für Typ-Inferenz und Lesbarkeit zirkuläre Abhängigkeiten zu vermeiden, und nicht, sie zu bedeuten, wenn sie nicht verwendet werden.

Ich schlage vor, die Frage zu bearbeiten, um entweder für Funktionen in der Regel zu fragen, oder für verschiedene Arten stellen (in diesem Fall würde ich die ersten beiden Fälle aus dieser Antwort entfernen). Methoden werden in der Regel als eine Teilmenge von Funktionen sein, die der allgemeine mathematische Begriff ist. Allerdings sind alle # Funktionen F sind technisch CLI Methoden , wie das ist, was sie sind, zusammengestellt. Wie ist es nicht klar, was die Frage ist zu fragen, aber ich aus der akzeptierten Antwort davon aus, dass es nur für Methoden nicht fragen, wie der Titel bedeuten würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top