2013-04-02 2 views
3

Я очень зелёный, когда дело доходит до F #, и я столкнулся с небольшой проблемой, связанной с рекурсивными функциями, которые, как я надеялся, могут помочь мне понять.F # рекурсивная функция в странной бесконечной петле

У меня есть функция, которая должна выплюнуть следующее четное число:

let rec nextEven(x) = 
    let y = x + 1 
    if y % 2 = 0 then y 
    else nextEven y 


// This never returns.. 
nextEven 3;; 

я использую «REC» ключевое слово, так что это будет рекурсивным, хотя, когда я использую его, он просто будет работать в бесконечной петле по какой-то причине. Если я переписал функцию следующим образом:

let nextEven(x) = 
    let y = x + 1 
    if y % 2 = 0 then y 
    else nextEven y 

Тогда все работает нормально (нет ключевого слова rec). По какой-то причине я, хотя мне нужен «rec», поскольку функция является рекурсивной (так почему бы и нет?) И почему первая версия функции выполняется навсегда?

EDIT
Оказывается, это был полный нуб ошибка. Я создал несколько определений функции на этом пути, как объясняется в комментариях + ответах.

+0

Первый образец работает отлично на моей машине. Какой вклад вы используете, и какую версию F # вы используете? – JaredPar

+0

Я до сих пор использую F # interactive в VS 2012 –

+2

У вас, по-видимому, есть несколько определений 'nextEven'. Это единственное объяснение для второй функции, работающей (и, вероятно, для первой, которая не возвращается). Попробуйте сбросить FSI. – Daniel

ответ

5

Я подозреваю, что у вас есть несколько определений nextEven. Это единственное объяснение для вашего второго примера компиляции. Repro:

module A = 
    let rec nextEven(x) = 
    let y = x + 1 
    if y % 2 = 0 then y 
    else nextEven y 

open A //the function below will not compile without this 

let nextEven(x) = 
    let y = x + 1 
    if y % 2 = 0 then y 
    else nextEven y //calling A.nextEven 

Попробуйте сбросить сеанс FSI.

+0

Да, это было, несколько определений. Я сказал, что я был noob =). –

Смежные вопросы