Невозможно определить рекурсивный метод с ключевым словом let в F # - PullRequest
0 голосов
/ 11 апреля 2020

Я изучаю F # с VS.

Скажите, почему компилятор выдает ошибку FS3118 с приведенным ниже кодом?

"let" перед sumToN помечается красным под строкой ...

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

Как мне исправить код?

1 Ответ

5 голосов
/ 11 апреля 2020

Это ноль в самой последней строке. Поскольку он имеет отступ на один символ вправо, он считается частью блока 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
...