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

Tya*_*yam 0 recursion f# function let

我正在用 VS 学习 F#。

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

sumToN 之前的“let”在线条下用红色标记...

FS3118:不完整的值或函数定义。如果这是在表达式中,则表达式的主体必须缩进与“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
Run Code Online (Sandbox Code Playgroud)

我应该如何更正代码?

Fyo*_*kin 5

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

因此,整个函数main看起来就像它let的主体中只有一个,并且在let.

这是 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
Run Code Online (Sandbox Code Playgroud)