对于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错误。我已经创建了该函数的多个定义,如注释+答案中所述。
答案 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会话。