【问题标题】:Compiler warning: FS0058: Possible incorrect indentation编译器警告:FS0058:可能不正确的缩进
【发布时间】:2026-02-17 09:45:01
【问题描述】:

我用 Visual Studio 编写了这段代码,但是当我编译它时,它给了我这些警告:

FS0058:可能是不正确的缩进,这个标记超出了从位置 9:80 开始的上下文。尝试进一步缩进此标记或使用标准格式

但如果我尝试使用 OCaml 编译器编译它,它就可以工作。

let converti_tempo = (fun x -> if x < 0 then failwith "error" else if x < 1000 then (0, 0, x) else 
let rec m = x % 1000
let s = (x / 1000) % 60
let mm = ((x / 1000) / 60) % 60
in (mm,s ,m ));;

【问题讨论】:

    标签: f# indentation compiler-warnings


    【解决方案1】:

    在第一行的末尾有一个else。这意味着else 的表达式将在下一行定义,因此必须一直缩进到else,然后再缩进一点。代码如下:

    let converti_tempo = (fun x -> if x < 0 then failwith "error" else if x < 1000 then (0, 0, x) else 
                                                                                                   let rec m = x % 1000
                                                                                                   let s = (x / 1000) % 60
                                                                                                   let mm = ((x / 1000) / 60) % 60
                                                                                                   in (mm,s ,m ));;
    

    你也可以这样写:

    let converti_tempo = (fun x -> if x < 0 then failwith "error" 
                                   else if x < 1000 then (0, 0, x) 
                                   else
                                      let rec m = x % 1000
                                      let s = (x / 1000) % 60
                                      let mm = ((x / 1000) / 60) % 60
                                      in (mm,s ,m ));;
    

    【讨论】:

      【解决方案2】:

      我会说这是编写此函数的一种更“惯用”的方式

      let converti_tempo x =
          if x < 0 then
              failwith "error" 
          elif x < 1000 then
              (0, 0, x)
          else
              let m = x % 1000
              let s = x / 1000 % 60
              let mm = x / 1000 / 60 % 60
              (mm, s, m)
      

      【讨论】:

        【解决方案3】:

        对我来说,这个编译器警告是由我的一个“let”没有正确对齐引起的。确保所有函数声明都从每一行的开头开始。

        【讨论】: