PNS*_*PNS 3 lambda f# function
这是问题所在.我需要使用另一个函数计算f#中的函数.我有这段代码
let time f a =
let start = System.DateTime.Now in
let res = (fun f a -> f(a)) in
let finish = System.DateTime.Now in
(res, finish - start)
Run Code Online (Sandbox Code Playgroud)
我试图称之为
time ackermann (2,9);;
Run Code Online (Sandbox Code Playgroud)
我有一个函数ackermann,它将一个元组(s,n)作为参数可能是一个从根本上错误的东西,但我不认为我远离一个可能看起来有点像这样的解决方案.
有什么建议?
哦顺便问一下.我得到的错误信息是:
stdin(19,1):错误FS0030:值限制.值'it'被推断为具有泛型类型val:(('_a - >'_ b) - >'_a - >'_ b)*System.TimeSpan
将'it'定义为一个简单的数据项,使其成为具有显式参数的函数,或者,如果您不打算使用它,则添加类型注释.
你至少有两个问题:
let res = f a
.您已经拥有了值f
和a
范围,但是您当前正在定义res
一个新函数f
并将其应用于新函数a
.DateTime
s(适用于表示日期和时间,而不是短时间).相反,你应该使用一个System.Diagnostics.Stopwatch
.你可以这样做:
let time f =
let sw = System.Diagnostics.Stopwatch.StartNew()
let r = f()
sw.Stop()
printfn "%O" sw.Elapsed
r
Run Code Online (Sandbox Code Playgroud)
用法
time (fun () -> System.Threading.Thread.Sleep(100))
Run Code Online (Sandbox Code Playgroud)
在向fsi发送大量内容时,我通常会在代码文件中保留以下内容.
#if INTERACTIVE
#time "on"
#endif
Run Code Online (Sandbox Code Playgroud)
这打开了fsi的内置时序,它提供的不仅仅是执行时间:
Real: 00:00:00.099, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0