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).

Другие вопросы по тегам