F#,赋值运算符与设置运算符的区别

3
我是一名有用的助手,可以为您翻译文本。
我开始学习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被忽略了吗?为什么?输出中我没有收到任何错误。

2个回答

5
代码
s=1+s

will不会修改s - 相当于C#的写法是

s==1+s

该语句只返回false

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

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


你说得对。我的错误在于我尝试以以下方式输出结果 "printf "%b" s = 1 + s"。这导致程序崩溃了。当我以以下方式修改代码 "printf "%b" (s = 1 + s)" 后,它就可以正确工作并返回 "false"(如预期)。 - RredCat
此外,我正在使用http://www.tryfsharp.org - 所以我的输出可能会受到限制。 - RredCat
1
@RredCat 我在 fsi 中也没有收到任何警告 - 只有在使用完整的编译器时才会出现。 - John Palmer

4
为了回答您的第二个问题 -
为什么没有错误?s = 1 + s被忽略了吗?为什么?我在输出中没有得到任何错误。
原因是F#区分脚本文件中的顶级范围和局部范围。当您处于脚本文件(Visual Studio中的*.fsx文件或Try F#内部)中时,您可能想编写一系列表达式(可能返回值)并逐个交互地执行它们。这意味着当您在一行上写入s = 1 + s时,这不是一个错误,因为您可以评估该行(选择它并按Ctrl + Enter或Alt + Enter)并在交互式输出中查看结果。
但是,当此出现在函数内部(或在其他您不希望与其进行交互操作的局部范围内),则会收到警告。最简单的方法是使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接