OCaml中的toString()等效项

OCaml中的toString()等效项,ocaml,Ocaml,我是OCaml新手,正在尝试调试一些OCaml代码。 OCaml中是否有任何函数相当于Java中的toString()函数,通过该函数可以将大多数对象打印为输出?在Pervisives模块中有诸如int的字符串、float的字符串、bool的字符串等函数(您不必打开Pervisives模块,因为它是…普及的) 或者,您可以使用Printf来进行这种输出。例如: let str = "bar" in let num = 1 in let flt = 3.14159 in Printf.printf

我是OCaml新手,正在尝试调试一些OCaml代码。
OCaml中是否有任何函数相当于Java中的
toString()
函数,通过该函数可以将大多数对象打印为输出?

在Pervisives模块中有诸如int的字符串、float的字符串、bool的字符串等函数(您不必打开Pervisives模块,因为它是…普及的)

或者,您可以使用Printf来进行这种输出。例如:

let str = "bar" in
let num = 1 in
let flt = 3.14159 in
Printf.printf "The string is: %s, num is: %d, float is: %f" str num flt 
Printf模块中还有一个sprintf函数,因此如果您只想创建一个字符串而不是打印到stdout,您可以将最后一行替换为:

let output = Printf.sprintf "The string is: %s, num is: %d, float is: %f" str num flt

对于您自己定义的更复杂的数据类型,您可以使用扩展,这样您就不需要为您的类型定义自己的漂亮的打印机函数。

如果您使用Core和相关的Sexplib语法扩展,有很好的解决方案。本质上,sexplib自动生成从OCaml类型到s表达式的转换器,提供了一种方便的序列化格式

下面是一个使用Core和Utop的示例。确保按照以下说明进行设置以使用Core:

utop[12]>类型foo={x:int
;y:弦
;z:(int*int)列表
}
有性别歧视;;
输入foo={x:int;y:string;z:(int*int)list;}
val foo\u of_sexp:sexp.t->foo=
val sexp_of_foo:foo->sexp.t=
utop[13]>let thing={x=3;y=“hello”;z=[1,1;2,3;4,2]};;
val thing:foo={x=3;y=“你好”;z=[(1,1);(2,3);(4,2)]}
乌托普[14]>sexp__foo thing;;
-:Sexp.t=((x3)(yhello)(z((11)(23)(42)))
乌托普[15]>sexp|u of|foo thing |>sexp.to_string_hum;;
-:string=“((x3)(yhello)(z((11)(23)(42))”
您还可以使用以下内联引号语法为未命名的类型生成sexp转换器

utop[18]> (<:sexp_of<int * float list>> (3,[4.;5.;6.]));;
- : Sexp.t = (3 (4 5 6))
utop[18]>((3,4,5,6.]);;
-:Sexp.t=(3(4 5 6))

这里有更多详细信息:

Sexplib库也很有用。它一直是OCaml的致命弱点。答案可能取决于您使用的是核心还是电池。
utop[18]> (<:sexp_of<int * float list>> (3,[4.;5.;6.]));;
- : Sexp.t = (3 (4 5 6))