如何编写采用可变数量参数的F#printfn的自定义版本?

Vag*_*lov 2 printf f#

我想编写F#printfn函数的扩展版本,该功能除了显示文本外还显示当前时间。像这样:

let printimefn fmt =
    let time = DateTime.Now
    let strtime = sprintf "%02d:%02d:%02d" time.Hour time.Minute time.Second
    printfn "%s %A"  strtime fmt
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不能按预期工作。“ fmt”参数丢失其类型Printf.TextWriterFormat <'T>。

我可以通过使用类型注释来强制其类型:

let printimefn (fmt : Printf.TextWriterFormat<'T>) =
    let time = DateTime.Now
    let strtime = sprintf "%02d:%02d:%02d" time.Hour time.Minute time.Second
    printfn "%s %A"  strtime fmt
Run Code Online (Sandbox Code Playgroud)

但随后printimefn的结果变为单位,而不是'T。因此它仍然不起作用。我想知道编写自定义printfn函数的正确方法是什么。

Man*_*rse 5

这可以用 Printf.ksprintf

let printimefn fmt =
    let time = DateTime.Now
    Printf.ksprintf (
        fun s ->
            printfn "%02d:%02d:%02d %s" time.Hour time.Minute time.Second s)
        fmt
Run Code Online (Sandbox Code Playgroud)