質問

私は2つの方法がお互いを呼び出すために取得する方法のように少し困惑している(すなわち、A()コールB()B()コールA()を持っています)。それはしていない場合、それだけで、の値またはコンストラクタがの定義されていないと言うようにします。

それがコードに遭遇していた後、F#は唯一の方法で「見ている」と思われます

私はここで非常に基本的な何かが足りないのですか?

役に立ちましたか?

解決

'... RECましょうと...' あなたが求めて構文です。

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

F#共同でも冒険を参照してください。 -Recursionするます。

他のヒント

質問は方法についてです、とブライアンの答えは機能についてですので、多分それはあなたがタイプのために同様の構文を使用することができることを指摘すると便利です。

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

注意もメンバーが(実際に私は、彼らが再帰的ではないことができないと思います)、デフォルトで「RECましょう」。

であることを

F#4.1を発表<のhref = "https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/modules#module-rec-allowing-mutual-recursive-code-at-the -moduleレベル」REL = "noreferrer">相互に再帰的なモジュールと名前空間の

これらはandキーワードに代わるものです。

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

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

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

recキーワードはモジュールと名前空間定義する「相互再帰的であることがすべて含まれているコードを可能にする。」

レットで宣言

機能

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にのみ使用されます。呼び出された関数が最初に来るように、それ以外の場合は、再順番に宣言方が良いかもしれません。循環依存を避けるために、それらが使用されていない場所にそれらを意味するものではありませんし、多くの場合、型推論と可読性のために有用である。

私は一般的な機能を求めるためにいずれか、または(私はこの回答から、最初の2例を除くと思われる場合には)さまざまなタイプを求めるために、質問を編集することを提案します。方法は通常、一般的な数学的な用語である関数のサブセットであると考えられています。それは、それらがコンパイルされているものであるとして、しかし、すべてのF#関数は、のCLIメソッドの技術です。であるとして、質問が求めているものは明らかではないが、私はタイトルが示唆するようにだけでなく、方法を尋ねないことを受け入れ答えから想定しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top