我发现在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]);;
答案 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章。