【问题标题】: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()。
我对@987654327@ 的使用是正确的,错误出现在我的实现中的其他地方。
【解决方案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)