OCaml 顶层输出格式化

9
如果我在OCaml的toplevel中执行以下命令:
#require "num";;
open Ratio;;

ratio_of_int 2;;

输出结果为:
- : Ratio.ratio = <ratio 2/1>

这样的格式是如何实现的?根据源代码,Ratio.ratio是一个记录结构。因此输出应该更类似于:

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

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

2个回答

6

Findlib为比率模块专门提供了一个漂亮的打印机。它不会打印出<abstr>(接口未公开记录),而是打印出您看到的内容。如果您想查看,请看findlib/num_top_printers.ml:

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

是的,当我思考你(现在已删除的)问题时,我刚刚弄清楚了这个。感谢你的帮助! - Rutherford
是的,一开始我很困惑,因为我在工作电脑上没有安装findlib。我知道这是由于一个漂亮的打印机,但不知道漂亮的打印机位于何处,直到我意识到它是findlib。 - Niki Yoshiuchi
2
似乎在顶层使用自定义漂亮打印机非常容易。 - Rutherford
然而,我认为使用漂亮的打印机只是OCaml中函数无法重载这一令人沮丧的限制的一种hack。 - Rutherford
如果URL再次更改,顶层自定义漂亮打印机的文档可以在OCaml手册14.2中找到。 - mndrix

5
顶层有一个指令#install_printer,它需要一个打印任何类型的函数。
例如,您可以像这样重新定义如何打印整数:
let print_integer ppf n = Format.fprintf ppf "Integer(%d)" n
#install_printer print_integer

#install_printer函数根据给定的参数函数类型(这里是Format.formatter -> int -> unit)选择打印机。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接