OCaml для верхнего уровня форматирования вывода - PullRequest
7 голосов
/ 15 декабря 2010

Если я выполню следующее на верхнем уровне 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 ]

6 голосов
/ 15 декабря 2010

Findlib имеет симпатичный принтер специально для модуля отношений. Вместо распечатки <abstr> (интерфейс не отображает запись), он печатает то, что вы видели. Если вы хотите проверить это, посмотрите на findlib / num_top_printers.ml:

let ratio_printer fmt v =
  Format.fprintf fmt "<ratio %s>" (Ratio.string_of_ratio v)
3 голосов
/ 17 февраля 2012

Верхний уровень имеет директиву #install_printer, которая принимает функцию для печати любого типа.

Например, вы можете переопределить способ печати целых чисел следующим образом:

let print_integer ppf n = Format.fprintf ppf "Integer(%d)" n
#install_printer print_integer

#install_printer выбирает принтеры в зависимости от типа функции, заданной в качестве аргумента (здесь Format.formatter -> int -> unit).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...