В строках формата есть спецификатор %a
, который позволяет вам печатать значение любого типа. Как правило, любой спецификатор в строке формата семейства printf требует добавления нуля или более аргументов определенного типа после этой строки, например,
printf "%d"
требуется один аргумент типа int
.
Спецификатор %a
запрашивает два аргумента, первый аргумент — это принтер с таким именем, а второй аргумент — само напечатанное значение. Принтер является функцией типа 'output_channel_type -> 'a -> unit
, а значение должно иметь тип 'a
, т. е. они должны совпадать. Например, если у вас есть вектор float
с макетом фортрана типа ('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
для Форматировать семейство функций. Этот тип принтеров также используется для печати в отладчике верхнего уровня или 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
— имя библиотеки.
person
ivg
schedule
07.04.2015