F#递归函数在奇怪的无限循环中

时间:2013-04-02 19:01:43

标签: f# f#-interactive

对于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',因为函数是递归的(所以我为什么不呢?)为什么函数的第一个版本会永远运行?

修改
事实证明这是一个总的noob错误。我已经创建了该函数的多个定义,如注释+答案中所述。

1 个答案:

答案 0 :(得分: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会话。