无法在 F# 中使用 let 关键字定义递归方法

Posted

技术标签:

【中文标题】无法在 F# 中使用 let 关键字定义递归方法【英文标题】:Can not define a recursive method with let key word in F# 【发布时间】:2020-07-23 19:20:09 【问题描述】:

我正在用 VS 学习 F#。

你能告诉我为什么编译器在下面的代码中给我一个错误 FS3118 吗?

sumToN 前面的“let”在行下用红色标记...

FS3118:值或函数定义不完整。如果 this 在表达式中,则表达式的主体必须缩进到与 'let' 关键字相同的列。

open System
[<EntryPoint>]
let main argv =
   let sumToN n = let rec f s n = if n > 0L then f (s+n) (n-1L) else s in f 0L n
   //let sum = sumToN(5L)
   //do printfn "%i" sum |> ignore
    0

我应该如何更正代码?

【问题讨论】:

【参考方案1】:

最后一行是零。因为它向右缩进一个字符,所以它被认为是let sumToN 块的一部分。

因此,整个函数main 看起来它的主体中只有一个letlet 之后没有行。

这是 F# 中的错误语法。如果函数体中没有要执行的行,则该函数什么也不做,因此拥有它没有意义。

要修复,取消缩进零:

let main argv =
   let sumToN n = let rec f s n = if n > 0L then f (s+n) (n-1L) else s in f 0L n
   //let sum = sumToN(5L)
   //do printfn "%i" sum |> ignore
   0

【讨论】:

以上是关于无法在 F# 中使用 let 关键字定义递归方法的主要内容,如果未能解决你的问题,请参考以下文章

js中let和const关键字

F#遍历相互递归的树来计算元素

为啥 Java 变量不更频繁地声明为“final”?与 swift 中的 let 关键字进行比较 [关闭]

从递归到冒泡然后到装饰器

使用“let”关键字将数据传递给组件

Java中的递归nCr组合