如何计算f#中的任意函数

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'定义为一个简单的数据项,使其成为具有显式参数的函数,或者,如果您不打算使用它,则添加类型注释.

kvb*_*kvb 9

你至少有两个问题:

  1. 试试let res = f a.您已经拥有了值fa范围,但是您当前正在定义res一个新函数f并将其应用于新函数a.
  2. 不要使用DateTimes(适用于表示日期和时间,而不是短时间).相反,你应该使用一个System.Diagnostics.Stopwatch.


Dan*_*iel 7

你可以这样做:

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