用另一个函数组合函数`Printf.sprintf`

问题描述 投票:2回答:1

我有很多事情将Printf.sprintf的结果插入另一个函数(比如说)f。我一直试图定义这两个组合printf,像这样:

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

但是,这不是类型检查,并且它的版本也没有Obj.magic的几个应用程序。获得这样一个“自定义printf”的正确方法是什么?

types ocaml
1个回答
8
投票

不要使用Obj.magic

由于格式字符串的特殊输入实现了可变的printf,你不能使用简单的函数组合来编写这样的东西:

let sprintf_then_f fmt args ... = f (Printf.sprintf fmt args ...)

为了克服这个困难,Printfk等名称中提供了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
*)
© www.soinside.com 2019 - 2024. All rights reserved.