2012-02-10 97 views
2

所以我有,我已经从一个教程拉到功能:如何在另一个函数中嵌入函数调用?

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) 

然而,这种失败,出现以下错误:

Type mismatch. Expecting a 'a -> unit but given a 'a -> int The type 'unit' does not match the type 'int'

在调用该函数的行上。我在这里是否有某种语法错误,或者我是否严重误解了一个概念?

回答

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 
+0

而管道忽略不会导致它被优化掉或什么,对吧? – GWLlosa 2012-02-10 02:48:24

+0

对。它绝对不会。 – Daniel 2012-02-10 02:58:44

相关问题