我目前正在查看此文档并尝试识别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文档的最佳方法是什么?对于大多数库来说,教程,注释和解释似乎都非常稀疏。我不想继续问这些问题,但很多文档都非常糟糕。
感谢您的帮助!
答案 0 :(得分:2)
格式字符串中有一个%a
说明符,允许您打印任何类型的值。通常,printf-family格式字符串中的任何说明符都要求您在此字符串后添加零个或多个特定类型的参数,例如,
printf "%d"
需要一个int
类型的参数。
%a
说明符要求两个参数,第一个参数是如此命名的打印机,第二个参数是打印值本身。打印机是'output_channel_type -> 'a -> unit
类型的函数,值必须为'a
类型,即它们必须匹配。例如,如果您的float
向量具有名为('el, 'elt, Bigarray.fortran_layout) Bigarray.Array1.t
的{{1}}类型的fortran布局,则可以使用vec
函数输出它,例如,
pp_fvec
让我也澄清 Format.printf "vec = %a" pp_fvec vec
的含义,我把它留作类型变量,但通常它是具体的,并且等于特定函数可以写入的通道的类型。例如,'output_channel_type
函数中的%a
说明符要求您提供打印到Printf.printf
的函数,out_channel
的相同说明符要求打印到输出通道的函数类型Format.printf
等等。通常,此类型必须等于格式化字符串的Format.formatter
类型的第二个类型参数。
因此,总而言之,此format
系列函数通常用作Format函数族pp*
格式说明符的打印机。这种类型的打印机也用于打印到顶级或ocaml调试器(并可以与%a
指令一起安装)。
当然,它可以在独立模式下使用,没有install_printer
功能,如下所示:
printf
这大致相当于上面的例子。
在对后续问题的回答中,所有OCaml库都具有已经使用 open Format
pp_fvec std_formatter vec
文件自行记录的查杀功能。将自己介绍给某个库的最佳方法是使用您喜欢的编辑器并阅读该库的mli
个文件。随着mli
和ocamlmerlin
等现代工具的发展,这变得更加容易。你可以跳转到定义。您可以通过ocp-index
命令找到特定库安装其mli
文件的位置,其中opam config var library_name:lib
是库的名称。