Рекурсивные функции в объектах OCaml - PullRequest
3 голосов
/ 09 марта 2009

Я пытаюсь выяснить рекурсию для 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 ]

4 голосов
/ 09 марта 2009

Вам все еще нужно вызвать doIt в вашем методе loopTest. let просто определяет doIt, точно так же, как method просто определяет метод и не вызывает его. Компилятор обнаруживает это, потому что он не знает, что возвращать из loopTest (как метод, который не имеет возвращаемого типа void, но не имеет реализации в C # или Java).

Кроме того, вы находитесь в бесконечном цикле с этим кодом, возможно, if x>1 then doIt (x-1), за которым следует doIt 100, является лучшей идеей.

2 голосов
/ 09 марта 2009

Мой OCaml ржавый, но я не думаю, что пусть оценивает, с чем он связан. Если вы хотите, чтобы testLoop вызывал doIt, добавьте in in doIt или аналогичный.

0 голосов
/ 28 марта 2009

Два бесконечных цикла в одном и том же коде;), вы должны узнать об Итераторах, я думаю;)

...