OCaml顶级输出格式

时间:2010-12-15 19:11:53

标签: ocaml

如果我在OCaml的顶层中执行以下操作:

#require "num";;
open Ratio;;

ratio_of_int 2;;

输出结果为:

- : Ratio.ratio = <ratio 2/1>

这样的格式怎么样? sources告诉我Ratio.ratio是一个记录。所以输出应该更类似于

{numerator = <big_int 2>; denominator = <big_int 1>; normalized = true}

我试过看看比率输出是否以某种方式硬编码在顶层,但这种搜索没有结果。作为OCaml的新手,我必须问我是否遗漏了一些重要的东西?在一个重载了字符串化函数的语言中,这并不奇怪,但在OCaml的情况下,我发现这种行为非常不合适。

2 个答案:

答案 0 :(得分:6)

Findlib有一个专门用于比率模块的漂亮打印机。它不是打印出<abstr>(界面不公开记录),而是打印出你看到的内容。如果要查看它,请查看findlib / num_top_printers.ml:

let ratio_printer fmt v =
  Format.fprintf fmt "<ratio %s>" (Ratio.string_of_ratio v)

答案 1 :(得分:3)

toplevel有一个指令#install_printer,它接受​​一个打印任何类型的函数。

例如,您可以重新定义如何打印这样的整数:

let print_integer ppf n = Format.fprintf ppf "Integer(%d)" n
#install_printer print_integer

#install_printer根据作为参数给出的函数类型选择打印机(此处为Format.formatter -> int -> unit)。