将语句(表达式)分成多行:如何缩进

LLS*_*LLS 7 f# indentation

我发现在F#中搜索简单的缩进指南非常困难.基本上,我想知道多行语句缩进的规则是什么.在C#中,没有问题,因为空白不计算在内.虽然我可以根据自己的直觉编写F#代码并且它有效但我真的想知道将一个语句分成多行的规则是什么.我写的是

printfn "%d"
    1
Run Code Online (Sandbox Code Playgroud)

它按预期工作

如果我把它们写在同一列中,就会出错.

>
printfn "%A%A"
1
[];;
> //nothing is returned... and no error in this case
Run Code Online (Sandbox Code Playgroud)

我想确认这样做的基本规则.当你无法确定自己在做什么时,这有点烦人.

提前致谢

我刚试了另一个案子

List.iter
    (printfn "%d")
        [1..10];;
Run Code Online (Sandbox Code Playgroud)

它打印出1到10.为什么不是

List.iter
    ((printfn "%d")
        [1..10]);;
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 7

正如Yin指出的那样,规则是函数的参数应该比函数调用进一步缩进.要添加更多详细信息,您的第一个代码段将解释如下:

printfn "%A%A";
1;
[];
Run Code Online (Sandbox Code Playgroud)

这些中的每一个都是一个有效的表达式,它返回一些东西(函数,数字,空列表),然后忽略结果并继续.因为它们是在顶级作用域中编写的,所以F#Interactive不会发出警告您忽略了某些值.如果他们在do街区或let声明中:

do
  printfn "%A%A"
  1
  []
Run Code Online (Sandbox Code Playgroud)

F#编译器在对;不返回的表达式(using )进行排序时会发出警告unit:

stdin(5,3):警告FS0193:该表达式是一个函数值,即缺少参数.它的类型是'a - >'b - >单位.

stdin(6,3):警告FS0020:该表达式应该具有类型'unit',但是具有typ e'int'.使用'ignore'丢弃表达式的结果,或'let'将结果绑定到名称.

stdin(5,3):警告FS0020:这个表达式应该有'unit'类型,但是有一个'e''列表'.使用'ignore'来丢弃表达式的结果,或者'let'将结果赋予名称.