String OCaml:将字符串转换为(&x27;a,单位,字符串)格式?

String OCaml:将字符串转换为(&x27;a,单位,字符串)格式?,string,printf,ocaml,String,Printf,Ocaml,我需要将字符串转换为格式。我得到了一个格式数组,我希望访问每个格式并在它们上使用sprintf e、 g 我看见了。根据最佳答案,不同的字符串产生不同类型的格式,这就是为什么: let errors = [| format_of_string "format 1"; format_of_string "format 2"; ... format_of_string "format 512" |]

我需要将字符串转换为格式。我得到了一个格式数组,我希望访问每个格式并在它们上使用sprintf

e、 g

我看见了。根据最佳答案,不同的字符串产生不同类型的格式,这就是为什么:

let errors = [| format_of_string "format 1"; 
                format_of_string "format 2"; 
                ...
                format_of_string "format 512" |]
不起作用

有没有办法将所有格式存储为字符串,然后在需要时进行转换?或者我必须为每个字符串编写一个函数?e、 g

let error1 = sprintf "format 1" args
let error2 = sprintf "format 1" args
...
let error512 = sprintf "format 512" args

您可以使用
Scanf.format\u from\u string
string
类型的任意静态未知值转换为
format6
类型的值。但是,当然,您需要知道格式的类型(它们都应该统一)

下面是一个激励性的例子:

# let fmt = Scanf.format_from_string "Hello: %d" "%d";;
val fmt : (int -> '_a, '_b, '_c, '_d, '_d, '_a) format6 = <abstr>
# Printf.printf fmt 12;;
Hello: 12- : unit = ()
#让fmt=Scanf.format_来自_字符串“Hello:%d”“%d”;;

val fmt:(int->’_a’、_b’、_c’、_d’、_d’、_a)format6=是此功能的一个更极端的用法。

所以它们的类型必须都相同,对吗?e、 g.对于数组:
[|“格式1”;“格式2”…;“格式512”|]
“格式1”到“格式512”在从字符串
通过
格式转换时必须产生相同的类型。玩过之后,我发现了同样的问题。我无法存储字符串,然后将其转换为格式。e、 g.
let s=“string”;格式化\u字符串的\u不起作用。但是,有效的方法是将它们作为
format6
元素存储到数组中。这意味着我必须通过添加缺少的参数来统一它们的类型。问题是,如果您的格式有5个输入,您必须知道5个输入中的哪一个是要使用的,因此这是一个难看的解决方案。您应该使用
Scanf.format\u from\u string
它可以处理任何字符串。如果格式不匹配,它将在运行时失败。但是你确实需要知道一种格式的类型,不同格式之间唯一不同的是实际的文本,但我似乎不能给它存储的字符串。e、 g.
let s=“你好%s”;;Printf.sprintf(Scanf.format_from_string s)“world”给我一个类型错误。我现在对每种字符串格式都使用独立的函数,因为printf对存储字符串和键入字符串(即“像这样的字符串”)的处理方式似乎有所不同。噢,我现在似乎更了解它了。\u字符串的Scanf.format\u要求您指定放置格式字符串的位置。i、 e.
Printf.sprintf(来自字符串s“%s”)“world”的Scanf.format现在更容易理解了。尽管如此,在调用它时,我仍然需要知道格式的类型,这会清除很多东西。谢谢
# let fmt = Scanf.format_from_string "Hello: %d" "%d";;
val fmt : (int -> '_a, '_b, '_c, '_d, '_d, '_a) format6 = <abstr>
# Printf.printf fmt 12;;
Hello: 12- : unit = ()