我在一个大型pp: out_channel -> t -> unit
上定义了一个漂亮的打印机t
。因此,我可以使用Printf.fprintf stdout "%a" x
x: t
,或Printf.fprintf chan "%a" pp x
chan: out_channel
等链式打印。
现在我需要将打印的内容转换为字符串或文本。有没有人知道是否有办法利用/使用函数pp
而不是从头开始编写函数to_string: t -> unit
?
答案 0 :(得分:2)
Format.asprintf
类型而不是pp
实施了Format.formatter
, out_channel
应该符合您的需求。 Format.formatter
是一种更通用的类型,应该优先于具体的out_channel
。事实上,漂亮的打印机的一种标准类型是Format.formatter -> 'a -> unit
类型,至少它是OCaml顶层,调试器和其他工具中的#install_printer
指令所要求的。 Core
库中使用相同类型的函数来实现Pretty_printer
接口。
因此,如果您将重新实现pp
函数以使用Format
模块(通常为此open Format
模块就足够了),那么您可以重复使用它。打印到out_channel
模块的函数无法重新定位以打印到字符串中。所以最好不要写它们。
答案 1 :(得分:0)
为了完成这项工作,你需要一些看起来像OCaml的东西,就像一个out通道,但是将数据保存在字符串(或缓冲区)中。不幸的是,在OCaml中没有这样的事情。