2009-03-09 4 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;; 

Как создать рекурсивную функцию такого типа в рамках метода?

Revised код:

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

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

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

2

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

-1

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

+0

это истинный чувак: D – 0xFF