3

オブジェクトのメソッドのコンテキストで 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;;
4

3 に答える 3

4

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

また、このコードで無限ループに陥っています。おそらく、if x>1 then doIt (x-1)その後に続くdoIt 100方が良い考えです。

于 2009-03-09T13:28:48.957 に答える
2

私の OCaml は錆びていますが、 let がそれが何をバインドしたかを評価しているとは思いません。testLoop で doIt を呼び出したい場合は、in doIt などを追加します。

于 2009-03-09T13:19:12.023 に答える
0

同じコード内の2つの無限ループ;)、私が推測するイテレータについて学ぶ必要があります;)

于 2009-03-28T14:57:08.523 に答える