【问题标题】:let bindings and constructors in F#让 F# 中的绑定和构造函数
【发布时间】:2013-01-06 19:08:56
【问题描述】:

我在 F# 中定义秒表:

open System.Diagnostics

let UptimeStopwatch = Stopwatch.StartNew()

我每 3 秒打印一次

printfn "%A" UptimeStopwatch.Elapsed

每次我得到“00:00:00.0003195”或类似的小东西。每次我引用 UptimeStopwatch 时,F# 都会调用构造函数吗?如果是这样,我如何绕过这个广告达到预期的效果?这是函数式编程和命令式编程的混乱混合。

【问题讨论】:

    标签: f# functional-programming


    【解决方案1】:

    F# 似乎可以解释如下语句

    let MyFunction = DoSomething()
    

    let MyFunction() = DoSomething()
    

    不同。第一个将DoSomething()的返回值绑定到变量MyFunction,第二个将动作DoSomething()绑定到函数MyFunction()

    我对@9​​87654327@ 的使用是正确的,错误出现在我的实现中的其他地方。

    【讨论】:

      【解决方案2】:

      我看到您已经在代码的其他地方发现了问题,但是您问题中的两行仍然需要一些时间来运行,而且有趣的是,您可以减少开销。

      当我在您的示例中运行这两行时,它会打印一个大约 0.0002142 的值。您可以通过使用let 存储经过的时间来缩小它,因为构造printf 格式字符串(第一个参数)的表示会产生一些开销:

      let UptimeStopwatch = Stopwatch.StartNew()
      let elapsed = UptimeStopwatch.Elapsed
      printfn "%A" elapsed
      

      这平均打印一个大约 0.0000878 的数字(小两倍)。如果你使用Console,结果是类似的(因为Elapsed属性是在Console被调用之前获得的,同时不需要做任何其他事情):

      let UptimeStopwatch = Stopwatch.StartNew()
      System.Console.WriteLine(UptimeStopwatch.Elapsed)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多