Несвязанное значение в рекурсивной функции (начинающий OCaml)

#recursion #ocaml

#рекурсия #ocaml

Вопрос:

Код:

 let isPrime x =
    let checkZero d = match (x mod d, x mod d   2, intRoot x < d) with
        | (0,_,_)    -> false
        | (_,0,_)    -> false
        | (_,_,true) -> true
        | _          -> checkZero (d   6) in
    match x with
        | 0 -> false
        | 1 -> true
        | 2 -> true
        | 3 -> true
        | _ -> match (x mod 2, x mod 3) with
            | (0,_) -> false
            | (_,0) -> false
            | _     -> checkZero 5
 

Ошибка:

 line 9, characters 24-33:
Error: Unbound value checkZero
 

Который ссылается на рекурсивный вызов checkZero (d 6)

Я попытался поместить функцию checkZero в качестве a let ... in в последнем checkZero 5 вызове и добавил / удалил x параметр в checkZero функции на случай, если произошла ошибка с определением.

(Запуск OCaml, загруженный на прошлой неделе на OSX через homebrew)

Ответ №1:

Если вы хотите, чтобы функция могла вызывать саму себя, вам нужно объявить ее рекурсивной:

 let rec checkZero d ...
 

Комментарии:

1. Сработало. Спасибо!