F#:使用字符串 - >单位函数编写sprintf以允许格式化

Rei*_*aka 2 printf f#

有关于如何对格式及其部件进行自定义处理的信息.我想做一些更简单的事情,具体来说,我想做一些事情的效果:

let writelog : string -> unit = ... // write the string to the log

let writelogf = sprintf >> writelog // write a formatted string to the log
Run Code Online (Sandbox Code Playgroud)

编译器对此感到困惑,我并不感到惊讶,但有没有办法让它工作?

Tom*_*cek 12

定义自己的函数的最简单方法printf是使用Printf.kprintf函数.第一个参数kprintf是一个函数,用于在格式化后显示结果字符串(因此您可以将它传递给您的writelog函数):

let writelog (s:string) = printfn "LOG: %s" s
let writelogf fmt = Printf.kprintf writelog fmt
Run Code Online (Sandbox Code Playgroud)

fmt被作为第二个参数传递的参数是特殊格式字符串.这比jpalmer的解决方案更好,因为如果你指定一些额外的参数,它们将被直接传递给kprintf(因此参数的数量可以取决于格式化字符串).

你可以写:

> writelogf "Hello";;
LOG: Hello

> writelogf "Hello %d" 42;;
LOG: Hello 42
Run Code Online (Sandbox Code Playgroud)