質問

オブジェクトのメソッドのコンテキストで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;;
役に立ちましたか?

解決

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

また、このコードで無限ループに陥ります。おそらく if x&gt; 1の場合、doIt(x-1)に続いて doIt 100 が良いでしょうアイデア。

他のヒント

OCamlは錆びていますが、letがバインドされたものを評価するとは思いません。 testLoopでdoItを呼び出したい場合は、doItまたは同様のものを追加します。

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

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