让F#中的绑定和构造函数

时间:2013-01-06 06:12:28

标签: f# functional-programming

我在F#中定义一个秒表:

open System.Diagnostics

let UptimeStopwatch = Stopwatch.StartNew()

我用

每3秒打印一次
printfn "%A" UptimeStopwatch.Elapsed

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

2 个答案:

答案 0 :(得分:6)

F#似乎解释了像

这样的陈述
let MyFunction = DoSomething()

let MyFunction() = DoSomething()

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

我对UptimeStopwatch的使用是正确的,错误在我的实施中的其他地方。

答案 1 :(得分: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)