[英]let bindings and constructors in F#
我在F#中定義一個秒表:
open System.Diagnostics
let UptimeStopwatch = Stopwatch.StartNew()
我每三秒鍾打印一次
printfn "%A" UptimeStopwatch.Elapsed
每次我得到“ 00:00:00.0003195”或類似的值。 每當我引用UptimeStopwatch時,F#都會調用構造函數嗎? 如果是這樣,我該如何繞過該廣告以達到預期的效果? 這是功能性和命令性編程的混亂混合。
F#似乎在解釋如下語句
let MyFunction = DoSomething()
和
let MyFunction() = DoSomething()
不一樣。 第一個將DoSomething()
的返回值綁定到變量MyFunction
,第二個將操作DoSomething()
綁定到函數MyFunction()
。
我對UptimeStopwatch
使用是正確的,並且該錯誤在實現中的其他地方。
我看到您已經在代碼的其他地方發現了問題,但是問題中的兩行仍然需要一些時間才能運行,而且有趣的是,您可以減少開銷。
當我運行示例中的兩行時,它將打印一個大約0.0002142的值。 您可以使用let
來存儲經過的時間,從而使時間更短,因為構造printf
格式字符串(第一個參數)的表示會帶來一些開銷:
let UptimeStopwatch = Stopwatch.StartNew()
let elapsed = UptimeStopwatch.Elapsed
printfn "%A" elapsed
這樣平均打印出大約0.0000878的數字(小兩倍)。 如果使用Console
,則結果類似(因為在調用Console
之前Elapsed
獲得Elapsed
屬性,並且在此期間無需執行其他任何操作):
let UptimeStopwatch = Stopwatch.StartNew()
System.Console.WriteLine(UptimeStopwatch.Elapsed)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.