OCaml для верхнего уровня форматирования вывода
Если я выполню следующее на верхнем уровне OCaml:
#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 ответа
Findlib имеет симпатичный принтер специально для модуля отношений. Вместо распечатки <abstr>
(интерфейс не отображает запись), он печатает то, что вы видели. Если вы хотите проверить это, посмотрите на findlib/num_top_printers.ml:
let ratio_printer fmt v =
Format.fprintf fmt "<ratio %s>" (Ratio.string_of_ratio v)
У верхнего уровня есть директива #install_printer
, который принимает функцию для печати любого типа.
Например, вы можете переопределить способ печати целых чисел следующим образом:
let print_integer ppf n = Format.fprintf ppf "Integer(%d)" n
#install_printer print_integer
#install_printer
выбирает принтеры в зависимости от типа функции, заданной в качестве аргумента (здесь Format.formatter -> int -> unit
).