【问题标题】:F#, assignment operator vs set operatorF#,赋值运算符与集合运算符
【发布时间】:2013-04-10 11:24:21
【问题描述】:

我从 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 被忽略了吗?为什么?我在输出中没有收到任何错误。

【问题讨论】:

    标签: f#


    【解决方案1】:

    代码

    s=1+s
    

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

    s==1+s
    

    只返回false

    事实上,编译器应该在该行上发出警告,说明某个值未被使用。

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

    【讨论】:

    • 你是对的。我的错误是我试图以“printf”%b“s = 1 + s”的方式输出结果。它已经崩溃了。当我以下一种方式修改我的代码时“printf“%b”(s = 1 + s)”。它工作正常并返回“false”(如预期的那样)
    • 此外,我使用的是tryfsharp.org - 所以我的输出可能有限。
    • @RredCat 我在fsi 中也没有收到任何警告 - 它们仅在使用完整编译器时出现
    【解决方案2】:

    回答你的第二个问题 -

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

    这样做的原因是 F# 区分脚本文件中的顶级范围和本地范围。当您在脚本文件(Visual Studio 或 Try F# 中的*.fsx 文件)中时,您可能想要编写一系列表达式(可能返回一个值)并一个一个交互地执行它们。这意味着当您在一行上写 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
    

    【讨论】:

      猜你喜欢
      • 2011-11-16
      • 1970-01-01
      • 2017-11-21
      • 2020-12-01
      • 1970-01-01
      • 2013-11-30
      • 2015-10-02
      • 2021-09-09
      • 1970-01-01
      相关资源
      最近更新 更多