2

我从 F# 开始,一些代码结构让我很奇怪。例如:

我有下一个代码:

let mutable s = 10
s <- 1 + s
printf "%i" s

从数学方面来看,一切都很清楚。我将“s”标记为可变并将新值分配给“s”。结果是 11。

让我试试其他部分的代码:

let mutable s = 10
s = 1 + s
printf "%i" s

这段代码有效。但我认为s = 1 + s从数学方面来说这有点奇怪。执行结果为 10。

我的问题,最后一个样本发生了什么?为什么我没有收到错误消息?只是s = 1 + s被忽略了吗?为什么?我在输出中没有任何错误。

4

2 回答 2

5

编码

s=1+s

will 不会修改s- 等效的 C# 是

s==1+s

刚刚返回false

事实上,编译器应该在该行上发出一个关于未使用值的警告。

=运算符只是进行相等性检查 - 它不分配任何值。

于 2013-04-10T11:29:54.067 回答
3

回答你的第二个问题——

为什么我没有收到错误消息?s = 1 + s 是否被忽略?为什么?我在输出中没有任何错误。

原因是 F# 区分脚本文件中的顶级范围和本地范围。当您在脚本文件(*.fsxVisual Studio 中的文件或 Try F# 中的文件)中时,您可能想要编写一系列表达式(可能返回值)并以交互方式逐个执行它们。这意味着当您s = 1 + s在一行上书写时,这不是错误,因为您可以评估该行(选择它并按 Ctrl+Enter 或 Alt+Enter)并在交互式输出中查看结果。

但是,当 this 出现在函数内部(或其他不希望以交互方式评估它的本地范围内)时,您会收到警告。最简单的查看方法是使用创建本地范围do(这也适用于 Try F#):

do
  let mutable s = 10
  s = 1 + s           // Warning: This expression should have type 'unit', 
                      //    but has type 'bool'. If assigning to a property 
                      //    use the syntax 'obj.Prop <- expr'.
  printf "%i" s
于 2013-04-10T13:49:01.643 回答