【问题标题】:F# recursive function in strange endless loop奇怪的无限循环中的F#递归函数
【发布时间】:2013-04-02 19:01:43
【问题描述】:

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

编辑
事实证明这是一个完全的菜鸟错误。正如 cmets + answers 中所解释的那样,我一路创建了函数的多个定义。

【问题讨论】:

  • 第一个示例在我的机器上运行良好。你给它什么输入,你使用什么版本的 F#?
  • 我目前在 VS 2012 中使用 F# 交互
  • 您显然有多个可用的nextEven 定义。这是第二个函数工作的唯一解释(可能是第一个不返回的函数)。尝试重置 FSI。
  • 这对我来说在相同的环境中效果很好。我将第一个示例复制 + 粘贴到 F# 文件中,将其发送到交互式然后执行 nextEven 3;;
  • 示例 1 也适用于 tryfsharp.org/Create

标签: f# f#-interactive


【解决方案1】:

我怀疑您对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 会话。

【讨论】:

  • 是的,就是这样,多个定义。告诉你我是个菜鸟 =)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
相关资源
最近更新 更多