Domanda

Sono un po 'confuso su come ottenere due metodo da chiamare l'un l'altro (cioè, avere A() chiamata B() e B() chiamata A()). Sembra che F # solo 'vede' il metodo dopo che è stato incontrato in codice, in modo se non è, si dice solo non è stato definito il valore o il costruttore .

Mi sto perdendo qualcosa di molto semplice qui?

È stato utile?

Soluzione

'let rec ... e ...' è la sintassi che cercate.

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

Adventures in F # Co -Recursion .

Altri suggerimenti

Dal momento che la domanda è sui metodi, e la risposta di Brian è sulle funzioni, forse è utile ricordare che è possibile utilizzare una sintassi simile per i tipi:

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

Si noti inoltre che i membri sono 'lasciate rec' di default (in realtà non credo che possano essere non ricorsiva).

F # 4.1 introduce reciprocamente moduli e namespace ricorsiva .

Si tratta di un'alternativa alla parola and.

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

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

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

La parola rec definisce moduli e namespace "consentire tutto il codice contenute siano reciprocamente ricorsivo."

Le funzioni dichiarate tramite let

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

Questi sono funzioni mutuamente ricorsive .

Metodi all'interno dello stesso tipo

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

Questa è banale; funziona solo. Nota commento di Abel però.

Metodi all'interno di diversi tipi

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

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

Questo utilizza la sintassi type ... and per tipi mutuamente ricorsivi .

Note

normalmente, and viene utilizzato solo se si verificano le chiamate in entrambe le direzioni. Altrimenti, può essere meglio per riordinare le dichiarazioni in modo che la funzione chiamata viene prima. Spesso è utile per tipo di inferenza e la leggibilità di evitare dipendenze circolari, e non implica loro dove non vengono utilizzati.

Propongo di modificare la domanda a uno chiedere per le funzioni in generale, o di chiedere per i diversi tipi (nel qual caso avrei rimuovere i primi due casi di questa risposta). I metodi sono generalmente considerati come un sottoinsieme di funzioni, che è il termine matematico generale. Tuttavia, tutte le funzioni F # sono tecnicamente metodi CLI , in quanto questo è ciò che sono compilati a. Come è, non è chiaro quale sia la questione sta chiedendo, ma suppongo dalla risposta accettata che non solo chiede per i metodi, come il titolo implicherebbe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top