Types 用另一个函数组合函数“Printf.sprintf”

Types 用另一个函数组合函数“Printf.sprintf”,types,ocaml,Types,Ocaml,我经常将Printf.sprintf的结果插入到另一个函数中(比如f)。我一直在尝试定义这两个元素的组合printf,如下所示: let printf : 'a 'b. ('a,unit,string) format -> 'b = (fun fmt -> Printf.sprintf fmt) |> f 但是,这不会进行打字检查,并且在几个应用程序中使用Obj.magic的版本也不会进行打字检查。获得这种“自定义打印”的正确方法是什么?不要使用Obj.magic 由于特

我经常将
Printf.sprintf
的结果插入到另一个函数中(比如
f
)。我一直在尝试定义这两个元素的组合
printf
,如下所示:

let printf : 'a 'b. ('a,unit,string) format -> 'b =
  (fun fmt -> Printf.sprintf fmt) |> f

但是,这不会进行打字检查,并且在几个应用程序中使用
Obj.magic
的版本也不会进行打字检查。获得这种“自定义打印”的正确方法是什么?

不要使用
Obj.magic

由于特殊类型的格式字符串可实现可变
printf
,因此无法使用简单的函数组合编写此类内容:

let sprintf_then_f fmt args ... = f (Printf.sprintf fmt args ...)
为了克服这一困难,
Printf
提供了延续式函数,其名称为
k
(kontiuation),如
Printf.ksprintf
。请使用它们:

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
*)

请不要在前面使用
'a'b.
。请注意,从4.02开始,格式字符串在内部由GADT实现,“%s”只是“CamlinternalFormatBasics”的语法糖。(格式(字符串(无填充,格式的结尾),“%s”)),因此,在格式字符串的键入中唯一剩下的魔法就是格式字符串和字符串文本的类型定向消歧。