函数修改 StringFormat

Function modifying StringFormat

我想创建一个函数,它将 StringFormat 作为参数,在其前面加上任意字符串,return 一个函数,它接受正确数量和类型的参数和 returns 使用 sprintf 和更改后的格式创建的字符串。

目标是创建一个产生如下结果的函数(要添加的字符串是 #):

xprintf "%d-%.2f" 5 5. // -> "#5-5.00"
xprintf "%A" [42] // -> "#[42]"

我曾天真地尝试过以下操作:

let xprintf (format: Printf.StringFormat<'a>) = Printf.StringFormat<'a>(string format |> (+) "#") |> sprintf

确实可以编译,但是我在运行时使用它时得到了 InvalidCastException。我开始认为这种方法行不通。自定义 PrintFormat 可以吗? Articles/guides 关于如何在重要级别上使用各种格式化程序的内容似乎非常稀缺。

您可以使用 Printf.kprintf 执行此操作。它通过延续 returns 格式化字符串,让您可以使用格式化字符串做任何您需要的事情:

let xprintf fmt =
  Printf.kprintf (fun s -> "#" + s) fmt

编辑: 我认为有一种方法可以直接使用格式字符串,但我从未这样做过。如果你想添加一个额外的参数,你仍然可以使用 kprintf 来做到这一点,只需在延续中再做一个格式化:

let xprintf fmt num =
  Printf.kprintf (sprintf "# %d %s" num) fmt