函数修改 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
我想创建一个函数,它将 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