与lacaml型签名混淆

时间:2015-04-07 07:03:27

标签: types ocaml signature

我目前正在查看此文档并尝试识别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文档的最佳方法是什么?对于大多数库来说,教程,注释和解释似乎都非常稀疏。我不想继续问这些问题,但很多文档都非常糟糕。

感谢您的帮助!

1 个答案:

答案 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个文件。随着mliocamlmerlin等现代工具的发展,这变得更加容易。你可以跳转到定义。您可以通过ocp-index命令找到特定库安装其mli文件的位置,其中opam config var library_name:lib是库的名称。