OCaml顶级输出格式

Rut*_*ord 7 ocaml

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

#require "num";;
open Ratio;;

ratio_of_int 2;;
Run Code Online (Sandbox Code Playgroud)

输出是:

- : Ratio.ratio = <ratio 2/1>
Run Code Online (Sandbox Code Playgroud)

这样的格式怎么可能?该人士告诉我,Ratio.ratio是一个记录.所以输出应该更接近于

{numerator = <big_int 2>; denominator = <big_int 1>; normalized = true}
Run Code Online (Sandbox Code Playgroud)

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

Nik*_*chi 6

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

let ratio_printer fmt v =
  Format.fprintf fmt "<ratio %s>" (Ratio.string_of_ratio v)
Run Code Online (Sandbox Code Playgroud)

  • 似乎使用[顶层的自定义漂亮打印机](http://caml.inria.fr/pub/docs/manual-ocaml/manual023.html#toc90)非常容易。 (2认同)

Fab*_*ant 5

顶层有一个指令#install_printer,它采用一个函数来打印任何类型。

例如,您可以重新定义如何打印整数,如下所示:

let print_integer ppf n = Format.fprintf ppf "Integer(%d)" n
#install_printer print_integer
Run Code Online (Sandbox Code Playgroud)

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