Question

Je suis un peu confus quant à la façon d'obtenir deux méthode pour appeler l'autre (par exemple, ont A() appel B() et B() appel A()). Il semble que F # ne « voit » la méthode après qu'il a été rencontré dans le code, donc si elle n'a pas, il dit simplement valeur ou constructeur n'a pas été défini .

Est-ce que je manque quelque chose ici très basique?

Était-ce utile?

La solution

'let rec ... et ...' est la syntaxe que vous cherchez.

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

Voir aussi Adventures in F # Co -Recursion .

Autres conseils

Étant donné que la question est sur les méthodes et la réponse de Brian est sur les fonctions, peut-être il est utile de signaler que vous pouvez utiliser une syntaxe similaire pour les types:

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

Notez également que les membres sont « let rec » par défaut (en fait, je ne pense pas qu'ils peuvent être pas récursive).

F # 4.1 introduit modules mutuellement récursif et des espaces de noms .

Ce sont une alternative au mot-clé and.

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

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

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

Le mot-clé rec définit modules et espaces de noms « permettre tout code contenu d'être mutuellement récursive. »

Les fonctions déclarées par let

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

Ce sont fonctions mutuellement récursives .

Méthodes dans le même type

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

Ceci est trivial; il fonctionne. Notez le commentaire d'Abel bien.

Méthodes dans différents types

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

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

Il utilise la syntaxe type ... and pour types mutuellement récursifs .

Remarques

Normalement, and est utilisé que si les appels se produisent dans les deux sens. Dans le cas contraire, il peut être préférable de réorganiser les déclarations pour que la fonction appelée vient en premier. Il est souvent utile pour le type inférence et la lisibilité pour éviter les dépendances circulaires, et de ne pas les impliquer où ils ne sont pas utilisés.

Je propose de modifier la question soit demander des fonctions en général, ou de demander différents types (dans ce cas, je supprimerais les deux premiers cas de cette réponse). Les méthodes sont généralement considérées comme un sous-ensemble de fonctions, qui est le terme mathématique générale. Cependant, toutes les fonctions F # sont techniquement méthodes CLI , comme c'est ce qu'ils sont compilés à. Comme il est, on ne sait pas ce que la question demandait, mais je suppose de la réponse accepté qu'il ne demande pas seulement des méthodes, comme le titre impliquerait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top