2009-03-09 15 views
3

オブジェクトのメソッドのコンテキストでOCamlの再帰を調べようとしています。私は次のコードを試しましたが、コンパイルすることはできません。OCamlオブジェクト内の再帰関数

class foo = 
object (self) 
method loopTest = 
    let rec doIt x = 
    Printf.printf "%d\n" x; 
    if x>1 then doIt (x+1) 
end;; 

メソッド内でこのソートの再帰関数を作成するにはどうすればよいですか?

改訂コード:

class foo = 
object (self) 
method loopTest = 
    let rec doIt x = 
    Printf.printf "%d\n" x; 
    if x<10 then doIt (x+1) in doIt 0 
end;; 

答えて

3

なお、loopTestメソッドでdoItを呼び出す必要があります。 はちょうどmethodがちょうどメソッドを定義し、それを呼び出さないようにdoItを定義します。 loopTestから何を返すかわからないため(戻り値の型がなく、C#またはJavaで実装されていないメソッドのように)、コンパイラはこれを検出します。

また、このコードで無限ループに入っています。if x>1 then doIt (x-1)の後にdoIt 100と入力してください。

2

私のOCamlは錆びですが、私はそれがバインド何に評価をさせないと思います。 testLoopがdoItを呼び出すようにしたい場合は、doItまたはそれに類似するメソッドをタックします。

-1

同じコード内に2つの無限ループがあります;)あなたは私が推測する反復子について学ぶべきです;

+0

本当にそうです:D – 0xFF