2017-01-20 34 views
4

型内で再帰メンバ関数を定義すると、再帰的に関数を定義する必要はありません。 recキーワードの意味。F#再帰メンバ関数:「正しく定義する方法」

は、しかし、私はこれを行うとき:

type hello() = class 
    member this.recursion(x) = 
     match x with 
     |10 -> printfn "%A" x 
     |_ -> printfn "%A" x 
      recursion(x+1) 
end 

は、私は再帰が定義されていないというエラーが表示されます。

私はthis.recursionを試してみましたが、その後私はまだ言って警告を受ける:

再帰的なオブジェクト参照「これは」未使用です。再帰オブジェクト参照の存在により、実行時の初期化チェックが、このタイプおよび派生タイプのメンバーに追加されます。この再帰オブジェクト参照を削除することを検討してください。

私は型内で再帰メンバ関数を定義する正しい方法は何ですか?

+0

警告は、通常、関数ではなく_values_に対して発行されます。投稿したコードでこの警告が表示されますか?それとも、あなたが私たちに見せてくれない別のコードだったのですか? –

答えて

11

はい、メンバーとして定義すると機能します。 すでにお気づきのように、コールサイトでthisが不足しています。それは次のようになります。

this.recursion(x+1) 

しかし、これは、少なくとも私にとっては、うまく機能:

type hello() = class 
    member this.recursion(x) = 
     match x with 
     |10 -> printfn "%A" x 
     |_ -> printfn "%A" x 
     this.recursion(x+1) 
end 

他の回答ではなく、メソッド内であったとしてとにかく、私は、内部的にそれを定義します

type hello() = class 
    member this.recursion(x) = 
    let rec loop x = 
     match x with 
     |10 -> printfn "%A" x 
     |_ -> printfn "%A" x 
      loop (x+1) 
    loop x 
end 
+0

これは私の人生の道を将来もっと簡単にするでしょう! – Nulle

3

クラスの本体内に通常の再帰関数を定義することができます(プライベート関数になります)。例:

type Hello() = 

    let rec recursion x = 
     match x with 
     | 1 -> printfn "%A" x 
     | _ -> printfn "%A" x; recursion (x+1) 


    member this.Recursion(x) = recursion x 
+4

これは良い習慣だと思いますが、 '' member''の内部に '' let rec''を定義することにします。内部関数として、型レベルのスコープにする必要はありません。 – Gustavo

+0

これは本当に質問に答えません。 –

関連する問題