В строках формата есть спецификатор %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