有关于如何做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
我对编译器对此感到困惑并不感到惊讶,但是有什么方法可以使它工作吗?
答案 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
的额外参数中