2015-04-07 2 views
2

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

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? Учебники, комментарии и объяснения кажутся действительно разреженными в лучшем случае для большинства библиотек. Мне не терпится задавать эти вопросы, но документация по многим из них очень плохая.

Благодарим за помощь!

ответ

2

Спецификатор %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 - это имя библиотеки.

+0

Ничего себе, благодарю вас за то, что вы вошли в такие подробности. Я очень ценю это. – Steve

Смежные вопросы