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

时间:2011-04-24 14:58:14

标签: f# indentation

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

printfn "%d"
    1

按预期工作

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

>
printfn "%A%A"
1
[];;
> //nothing is returned... and no error in this case

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

提前致谢

我刚试了另一个案例

List.iter
    (printfn "%d")
        [1..10];;

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

List.iter
    ((printfn "%d")
        [1..10]);;

2 个答案:

答案 0 :(得分:7)

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

printfn "%A%A";
1;
[];

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

do
  printfn "%A%A"
  1
  []

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

  

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

     

stdin(6,3):警告FS0020:此表达式应为“unit”类型,但具有typ   e'int'。使用'ignore'来丢弃表达式的结果,或者'let'来绑定   结果是一个名字。

     

stdin(5,3):警告FS0020:这个表达式应该有'unit'类型,但是有typ   e''列表'。使用'ignore'丢弃表达式的结果,或'let'到b   把结果写成一个名字。

答案 1 :(得分:3)

在你的第二个例子中,你应该缩进:

>
printfn "%A%A"
  1
  [];;

否则这三个表达式是三个连续的表达式,而不是单个表达式。

您可以参考F# Language Specification查看公司规则,例如规范中的第15章。