调试错误:'let'不能是Fsharp中块中的最终代码元素

时间:2017-07-22 04:04:05

标签: f#

我的代码:

let main _ =

  let t = (System.Console.In.ReadLine ()) |> int

  for i in 1..t do
    let n = (System.Console.In.ReadLine ()) |> int

  0

我得到的错误如下: 这个'let'之后的块未完成。每个代码块都是一个表达式,必须有结果。 'let'不能是块中的最终代码元素。考虑给这个块一个明确的结果。

你能帮帮我吗?非常感谢你。

3 个答案:

答案 0 :(得分:5)

为了更详细地说明为什么需要这样做 - 在F#中,除了类型和模块定义之外,所有内容都是具有一些返回值的表达式。这甚至适用于像printf这样的东西 - 它们仍然返回值,但它是单位值,写为(),表示没有信息的虚拟值。

问题是let <var> = <expr>不是一个完整的表达式,因为它不会返回任何内容。完整表格为let <var> = <expr1> in <expr2>。这会将<expr1>的结果分配给变量<var>并评估<expr2>并返回结果。如果您正在使用换行符,则可以省略in,但仍需要一些正文。

在你的例子中,最好的选择是使用()作为正文,因为你没有返回任何有用的东西。您可以使用in或使用换行符来写这个:

for i in 1..t do
  let n = (System.Console.In.ReadLine ()) |> int in ()

for i in 1..t do
  let n = (System.Console.In.ReadLine ()) |> int
  ()

这不是一个非常有用的东西,因为你没有在任何地方使用n,但这是另一个问题。

答案 1 :(得分:1)

在for循环中,最后一个语句是let。将0缩进添加到同一级别应解决问题

答案 2 :(得分:0)

感谢John Palmer。我学到了很多东西。所以这就是问题的结果:

let t = (System.Console.In.ReadLine ()) |> int

for i in 1..t do
    let n = (System.Console.In.ReadLine ()) |> int

    printf("%d\n") n

    0

0