Спецификатор %a
в строках формата, который позволяет печатать значение любого типа. В общем, любой спецификатор в строке формата Printf семьи требуют, чтобы добавить ноль или более аргументов определенного типа после этой строки, например,
printf "%d"
требует один аргумент типа int
.
Спецификатор %a
запрашивает два аргумента, первый аргумент - так называемый принтер, а второй аргумент - это само печатное значение. Принтер является функцией типа 'output_channel_type -> 'a -> unit
, и значение должно иметь тип 'a
, т. Е. Они должны совпадать. Например, если у вас есть float
вектора с FORtran компоновкой типа ('el, 'elt, Bigarray.fortran_layout) Bigarray.Array1.t
именем vec
, вы можете использовать pp_fvec
функции для вывода его, например,
Format.printf "vec = %a" pp_fvec vec
Позвольте мне также уточнить смысл 'output_channel_type
, я оставил это быть переменной типа, но обычно он конкретный и равен типу канала, которому может писать конкретная функция. Например, спецификатор %a
в функции Printf.printf
требует предоставить функцию, которая печатает до out_channel
, тот же спецификатор для Format.printf
запрашивает функцию, которая печатает в выходной канал типа Format.formatter
и т. Д. В общем случае этот тип должен быть равен второму type типа format
типа строки форматирования.
Итак, в общем случае это семейство функций pp*
используется в качестве принтеров для спецификатора формата %a
для семейства функций Format. Этот тип принтеров также используется для печати в toplevel или ocaml-отладчик (и может быть установлен с директивами install_printer
). Конечно, он может быть использован в режиме автономного, без printf
функции, как это:
open Format
pp_fvec std_formatter vec
То есть примерно соответствует приведенному выше примеру.
В ответ на следующий вопрос все библиотеки OCaml имеют функцию убийства, которая уже самодокументирована файлами mli
. Лучший способ познакомиться с какой-либо библиотекой - использовать ваш любимый редактор и прочитать mli
файлов этой библиотеки. С развитием современных инструментов, таких как ocamlmerlin
и ocp-index
, это намного проще. Вы можете просто перейти к определению. Вы можете найти, где определенная библиотека устанавливает файлы mli
командой opam config var library_name:lib
, где library_name
- это имя библиотеки.
Ничего себе, благодарю вас за то, что вы вошли в такие подробности. Я очень ценю это. – Steve