如何在另一个函数中嵌入函数调用?

时间:2012-02-10 01:29:43

标签: .net f#

所以我有一个我从教程中提取的功能:

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'

类型不匹配

在调用该函数的行上。我在这里遇到某种语法错误,还是我误解了一个概念?

1 个答案:

答案 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