Путаница с подписью типа lacaml

В настоящее время я просматриваю этот документ и пытаюсь определить сигнатуру типа pp_fvec. По сути, я пытаюсь напечатать вектор, но он постоянно говорит мне, что у меня нет нужных типов.

http://mmottl.github.io/lacaml/api/Lacaml_io.html

Подпись типа, которую я заинтересован в использовании:

val pp_fvec : (float, 'elt) pp_vec

Что-то делает, а затем вызывает pp_vec с подписью:

type ('el, 'elt) pp_vec = Format.formatter ->
   ('el, 'elt, Bigarray.fortran_layout) Bigarray.Array1.t -> unit 

Что здесь происходит? Что значит

(float, 'elt) pp_vec 

на самом деле имеется в виду? Дополнительный вопрос, как мне это использовать? Как лучше всего найти и понять документацию по OCaml? Учебники, комментарии и пояснения кажутся в лучшем случае скудными для большинства библиотек. Я ненавижу задавать эти вопросы, но документация по многим из них действительно плохая.

Спасибо за вашу помощь!


person Steve    schedule 07.04.2015    source источник


Ответы (1)


В строках формата есть спецификатор %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
comment
Вау, спасибо, что вдались в такие подробности. Я очень ценю это. - person Steve; 07.04.2015