F#:用字符串组成sprintf - >单位功能允许格式化

时间:2011-08-09 11:29:24

标签: f# printf

有关于如何做custom processing on a format and its parts的信息。我想做一些更简单的事情,具体来说,我想做一些事情:

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

let writelogf = sprintf >> writelog // write a formatted string to the log

我对编译器对此感到困惑并不感到惊讶,但是有什么方法可以使它工作吗?

2 个答案:

答案 0 :(得分:12)

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

let writelog (s:string) = printfn "LOG: %s" s
let writelogf fmt = Printf.kprintf writelog fmt

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

你可以写:

> writelogf "Hello";;
LOG: Hello

> writelogf "Hello %d" 42;;
LOG: Hello 42

答案 1 :(得分:1)

这有效

> let writelog = fun (s:string) -> printfn "%s" s;;

val writelog : string -> unit

> let writelogf arg = sprintf arg >> writelog;;

val writelogf : Printf.StringFormat<('a -> string)> -> ('a -> unit)

> writelogf "hello %s" "world";;
hello world
val it : unit = ()
>

(会议来自FSI)

键位于writelogf

的额外参数中