如果我在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的情况下,我发现这种行为非常不合适.
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)
顶层有一个指令#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
)。
归档时间: |
|
查看次数: |
980 次 |
最近记录: |