如何在OCaml中获取格式化字符串?

如何在OCaml中获取格式化字符串?,ocaml,Ocaml,在OCaml中,我可以使用Printf.Printf输出格式化字符串,如 Printf.printf "Hello %s %d\n" world 123 然而,printf是一种输出 我想要的不是输出,而是字符串。例如,我想要 let s = something "Hello %s %d\n" "world" 123 然后我可以得到s=“Hello World 123” 我该怎么做?您可以使用Printf.sprintf: # Printf.sprintf "Hello %s %d\n"

在OCaml中,我可以使用
Printf.Printf
输出格式化字符串,如

Printf.printf "Hello %s %d\n" world 123
然而,
printf
是一种输出


我想要的不是输出,而是字符串。例如,我想要

let s = something "Hello %s %d\n" "world" 123
然后我可以得到
s=“Hello World 123”



我该怎么做?

您可以使用Printf.sprintf:

# Printf.sprintf "Hello %s %d\n" "world" 123;;
- : string = "Hello world 123\n"
您可以这样做:

$ ocaml
        OCaml version 4.00.1

# let fmt = format_of_string "Hello %s %d";;
val fmt : (string -> int -> '_a, '_b, '_c, '_d, '_d, '_a) format6 = <abstr>
# Printf.sprintf fmt "world" 123;;
- : string = "Hello world 123"
$ocaml
OCaml版本4.00.1
#设fmt=格式化字符串“Hello%s%d”的格式;;
val fmt:(字符串->整数->格式6=
#Printf.sprintf fmt“世界”123;;
-:string=“你好,世界123”

字符串的
format\u
函数(顾名思义)将字符串文本转换为格式。请注意,格式最终必须从字符串文本构建,因为这涉及到编译器的魔力。例如,您不能读取字符串并将其用作格式。(这不是类型安全的。)

我可以这样定义:
let fmt=“Hello%s%d\n”;;Printf.sprintf fmt“world”123
?@JacksonTale,我不太确定。似乎您可以执行
让fmt=Printf.sprintf“Hello%s%d\n”;;fmt“世界”123但是。@JacksonTale:如果这样做,它将推断出错误的类型(字符串而不是格式)。在OCaml中,字符串和格式元素之间的字符串文本有一个“重载”。要使其推断正确的内容,必须使用
format\u of_string
(这是一个识别函数,但有助于类型系统):
让fmt=format\u of_string“Hello%s%d\n”;;Printf.sprintf fmt“world”123
。或者您可以只做
(fun fmt->Printf.sprintf fmt“world”123)“Hello%s%d\n”
,如果这足够的话。