F#:用字符串组合sprintf->;允许格式化的单元函数

F#:用字符串组合sprintf->;允许格式化的单元函数,f#,printf,F#,Printf,有关于如何做的信息。我想做一些简单一点的事情,具体来说,我想做一些事情,效果如下: let writelog : string -> unit = ... // write the string to the log let writelogf = sprintf >> writelog // write a formatted string to the log 编译器对此感到困惑,我并不感到惊讶,但有什么方法可以让它工作吗?这是可行的 > let writelog

有关于如何做的信息。我想做一些简单一点的事情,具体来说,我想做一些事情,效果如下:

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

let writelogf = sprintf >> writelog // write a formatted string to the log
编译器对此感到困惑,我并不感到惊讶,但有什么方法可以让它工作吗?

这是可行的

> 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 = ()
>
>让writelog=fun(s:string)->printfn“%s”s;;
val writelog:字符串->单位
>让writelog arg=sprintf arg>>writelog;;
val writelogf:Printf.StringFormat(格式单位)
>写下“你好%s”“世界”;;
你好,世界
val it:unit=()
>
(会议由FSI主持)


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

作为第二个参数传递的
fmt
参数是特殊格式字符串。这比jpalmer的解决方案更有效,因为如果指定一些附加参数,它们将直接传递给
kprintf
(因此参数的数量可能取决于格式字符串)

你可以写:

> writelogf "Hello";;
LOG: Hello

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

@ankur-这与执行let t=“hi”是同一个问题;printf t-编译器不会将字符串文字强制为字符串类型的格式。您可能需要查看以下内容:。它是一个围绕log4net的薄包装,允许您编写:logger.Info“Hello%s”“world”哈,这非常简单。
> writelogf "Hello";;
LOG: Hello

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