将函数作为参数传递并使其超载

Ein*_*nsL 3 f# parametric-polymorphism

我想计算我的功能,其中一些最多使用三个参数.现在我正在使用下面相同的代码,其中包含三种变体.

let GetTime f (args : string) = 
    let sw = Stopwatch.StartNew()
    f (args)
    printfn "%s : %A" sw.Elapsed 
Run Code Online (Sandbox Code Playgroud)

我想用这个替换三个函数.

let GetTime f ( args : 'T[]) =
    let sW = Stopwatch.StartNew()
    match args.Length with
    | 1 -> f args.[0]
    | 2 -> f (args.[0] args.[1])
    printfn "%A" sW.Elapsed
    ()
Run Code Online (Sandbox Code Playgroud)

但是如果我使用它运行的三个函数,我会收到类型不匹配的错误.是否可以将函数作为参数发送并像这样使用它?

Mar*_*ann 5

为什么不做这样的事情呢?

let getTime f =
    let sw = Stopwatch.StartNew()
    let result = f ()
    printfn "%A" sw.Elapsed
    result
Run Code Online (Sandbox Code Playgroud)

假设f1,f2f3是分别取1,2,和3个参数三个功能,则可以使用getTime像这样的功能:

getTime (fun () -> f1 "foo")
getTime (fun () -> f2 "foo" "bar")
getTime (fun () -> f3 "foo" "bar" "baz")
Run Code Online (Sandbox Code Playgroud)

但是,如果您只需要在FSI中计算某些功能,则此功能已经内置:只需输入即可

> #time;;
Run Code Online (Sandbox Code Playgroud)

和时间将打开.