3

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

编辑
原来这是一个完全的菜鸟错误。正如评论+答案中所解释的那样,我一路创建了函数的多个定义。

4

1 回答 1

5

我怀疑您对nextEven. 这是您的第二个示例编译的唯一解释。复制:

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 会话。

于 2013-04-02T19:13:56.647 回答