お互いを呼び出す2つのメソッドを持ってするには?
-
22-08-2019 - |
質問
私は2つの方法がお互いを呼び出すために取得する方法のように少し困惑している(すなわち、A()
コールB()
とB()
コールA()
を持っています)。それはしていない場合、それだけで、の値またはコンストラクタがの定義されていないと言うようにします。
私はここで非常に基本的な何かが足りないのですか?
解決
他のヒント
質問は方法についてです、とブライアンの答えは機能についてですので、多分それはあなたがタイプのために同様の構文を使用することができることを指摘すると便利です。
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 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メソッドの技術です。であるとして、質問が求めているものは明らかではないが、私はタイトルが示唆するようにだけでなく、方法を尋ねないことを受け入れ答えから想定しています。