3

我有登录控制台的功能

        Printf.kprintf
            (printfn
                "[%s][%A] %s"
                    <| level.ToString()
                    <| DateTime.Now)
                    format // fprint to System.Console.Out maybe

但它使用 Printf.StringFormat 作为格式,现在我想遵循相同的逻辑并将其打印到文件中。

所以我尝试

        Printf.kfprintf 
            (fun f -> 
                fprintfn file "[%s][%A] " 
                        <| level.ToString()
                        <| DateTime.Now
                ) file (format)

还有两件事我无法理解。为什么有unit -> 'A而不是string -> 'A?我应该如何使用它?我可以StringFormat在这里使用我的TextWriterFormat吗?

另一个问题是,我继承了第一个片段formatstring -> 'Result但在 kfprintf 中我不能这样做,因为在内容unit -> 'Result之前出现了格式消息[x][x]。我想我可以以某种方式继承formatf但我找不到很好的例子,我唯一找到的是 F# 编译器的一部分:

[<CompiledName("PrintFormatToTextWriter")>]
let fprintf (os: TextWriter) fmt  = kfprintf (fun _ -> ()) os fmt 

[<CompiledName("PrintFormatLineToTextWriter")>]
let fprintfn (os: TextWriter) fmt  = kfprintf (fun _ -> os.WriteLine()) os fmt 

但我怎么能用这个unit?我如何在我的消息之后发布消息?

4

1 回答 1

4

我认为你不需要使用Printf.kfprintf,你可以继续使用Printf.kprintf作为内部 fprintfn使用的TextWriter

let logToWriter writer level format =
    Printf.kprintf (fprintfn writer "[%s][%A] %s" 
                    <| level.ToString() 
                    <| System.DateTime.Now) format

另请参阅以获取使用Printf.kfprintf.

于 2013-04-26T10:28:40.893 回答