OCaml:如何将字符串转换为('a,unit,string)格式?

4

我需要将字符串转换为格式。我有一个格式数组,我想访问每个格式并在其中使用sprintf。

例如:

let errors = [| "format 1"; "format 2"; ... ; "format 512" |]
let code_to_string (error_code : int) :(string) = sprintf errors.(error_code)

我看到了这个问题。根据最佳答案,不同的字符串会产生不同类型的格式,这就是为什么这样做:

let errors = [| format_of_string "format 1"; 
                format_of_string "format 2"; 
                ...
                format_of_string "format 512" |]

无法正常工作。

有没有一种方法可以将所有格式都存储为字符串,需要时再进行转换?或者我需要为每个字符串编写一个函数?例如:

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

3
你可以使用Scanf.format_from_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 = ()

顺便提一下,这里有一个更极端的使用该功能的例子。


所以它们的类型必须全部相等,对吗? 例如,对于一个数组:[| "format 1"; "format 2"; ... ; "format 512" |] 当通过 format_from_string 转换时,“format 1” 到 “format 512” 必须产生相同的类型。 - laifs
玩了一下之后,我发现了同样的问题。我无法存储字符串,然后将它们转换为格式。例如:let s = "string";format_of_string s;不起作用。但是,可以将它们存储到数组中作为format6元素。这意味着我必须通过添加缺失的参数来统一它们的类型。问题是,如果你有一个带有5个输入的格式,你必须知道哪些输入是要使用的,所以这是一个丑陋的解决方案。 - laifs
1
你应该使用Scanf.format_from_string,它可以与任何字符串一起使用。如果格式不匹配,它将在运行时失败。但实际上,您需要知道格式的类型,不同格式之间唯一可能变化的是实际文本。 - ivg
但是我似乎无法给它存储的字符串。例如,let s = "hello %s";;Printf.sprintf (Scanf.format_from_string s) "world";; 给了我一个类型错误。现在我为每个字符串格式使用独立的函数,因为存储的字符串和类型化字符串(即“像这样的字符串”)似乎被 printf 以不同的方式处理。 - laifs
哦,现在我似乎更好地理解了。Scanf.format_of_string要求您指定格式字符串的放置位置。例如:Printf.sprintf (Scanf.format_from_string s "%s") "world";; 现在这个问题容易理解多了。虽然,在调用时仍需要知道格式的类型,但这使事情变得更加清晰。谢谢。 - laifs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接