我有很多事情将Printf.sprintf
的结果插入另一个函数(比如说)f
。我一直试图定义这两者的构成printf
,如下所示:
let printf : 'a 'b. ('a,unit,string) format -> 'b =
(fun fmt -> Printf.sprintf fmt) |> f
然而,这不是类型检查,并且它的版本也没有Obj.magic
的多个应用程序。获得这样一个“自定义printf”的正确方法是什么?
答案 0 :(得分:8)
请勿使用Obj.magic
。
由于格式字符串的特殊输入要实现可变参数printf
,所以不能使用简单的函数组合来编写这样的东西:
let sprintf_then_f fmt args ... = f (Printf.sprintf fmt args ...)
为了克服这个困难,Printf
在诸如k
之类的名称中提供了Printf.ksprintf
(kontinuation)的连续样式函数。请使用它们:
val ksprintf : (string -> 'd) -> ('a, unit, string, 'd) format4 -> 'a
(** Same as [sprintf] above, but instead of returning the string,
passes it to the first argument.
@since 3.09.0
*)