所以我有一个我从教程中提取的功能:
let sumOfSquares nums =
nums
|> Seq.map sqr
|> Seq.sum
我已决定要测试其性能。在蛮力方法中,我会做类似的事情:
let timeFunction nums =
let sw = new System.Diagnostics.Stopwatch()
sw.Start()
nums
|> Seq.map sqr
|> Seq.sum
sw.Stop()
sw.ElapsedMilliseconds
然而,这让我感到震惊,因为F#应该如何将功能视为一等公民。所以我尝试做了类似下面的事情,而不是:
let timeFunction fn x =
let sw = new System.Diagnostics.Stopwatch()
sw.Start()
fn x
sw.Stop()
sw.ElapsedMilliseconds
然后我试着称之为:
let sequenceOfNums = [for i in 1..20 -> i]
let print n = System.Console.WriteLine(n.ToString())
print "Time Trial"
print (timeFunction sumOfSquares sequenceOfNums)
然而,这失败并出现以下错误:
类型不匹配。期待' a - >单位,但给出了&a;> int类型'单位'与' int'
类型不匹配
在调用该函数的行上。我在这里遇到某种语法错误,还是我误解了一个概念?
答案 0 :(得分:4)
由于fn
的结果未被使用,因此推断为unit
。您可以通过将结果传递给ignore
函数来解决此问题。它的签名是'a -> unit
,因此它使返回类型为fn
泛型(这就是你想要的)。
let timeFunction fn x =
let sw = new System.Diagnostics.Stopwatch()
sw.Start()
fn x |> ignore
sw.Stop()
sw.ElapsedMilliseconds