OCaml中的用户定义的打印机

ndb*_*dbd 8 printf ocaml pretty-print

printf,fprintf等等:都接受%a转换.

手册说%a:

"用户定义的打印机.使用两个参数并将第一个参数应用于outchan(当前输出通道)和第二个参数.因此,第一个参数必须具有类型out_channel - >'b - > unit和第二个'b.因此,函数产生的输出被插入到当前点的fprintf输出中."

我无法理解用户定义的打印机的用途,以及如何实现和使用它.有人可以解释动机并提供一个例子吗?

例如,当您想要打印复杂的数据结构时,为什么不能直接将自定义函数的数据结构打印到字符串或输出?

ako*_*ski 5

"打印复杂的数据结构"是什么意思?一旦定义了将数据结构转换为字符串的函数,就可以执行此操作.也可以使用"默认表示""转储"数据结构(参见http://caml.inria.fr/cgi-bin/hump.en.cgi?sort=0&browse=139)但更多的是调试比什么都重要.

话说回来; 一个非常简单的例子%a:

type ty = A | B

let ty_to_string = function
  | A -> "A"
  | B -> "B"

let print_ty chan v = output_string chan (ty_to_string v)

let _ = Printf.printf "%a" print_ty A
Run Code Online (Sandbox Code Playgroud)

  • 问题是,对于较大的结构,转换为字符串可能代价高昂(想想:字符串连接).如果可能,直接写入频道会更有效率.当你有像'%a`这样的函数自然而然地出现时. (2认同)

Jef*_*eld 2

如果你有一个函数 -> string你可以用它来"%s"打印你的数据,所以我认为在现实情况下你可以“只打印你的数据结构”。它可能是一种风格选择"%a"。在某些方面它确实看起来更加一致。

在 32 位系统上,字符串的长度限制为 16MB 左右。所以你可以想象这样一种情况:如果中间字符串比这个长,那么"%a"while 可以工作却会失败。"%s"不过,我在实践中从未遇到过这种情况。我只是"%s"自己用。