Types 与lacaml类型签名的混淆

Types 与lacaml类型签名的混淆,types,ocaml,signature,Types,Ocaml,Signature,我目前正在查看此文档,并试图确定pp_fvec的类型签名。基本上,我试图打印一个向量,但它不断告诉我,我没有正确的类型 我感兴趣的类型签名是: 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 这是怎么

我目前正在查看此文档,并试图确定pp_fvec的类型签名。基本上,我试图打印一个向量,但它不断告诉我,我没有正确的类型

我感兴趣的类型签名是:

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文档的最佳方式是什么?对于大多数库来说,教程、注释和解释似乎很少。我不想一直问这些问题,但是很多问题的文档都很糟糕


谢谢你的帮助

字符串格式中有一个
%a
说明符,允许您打印任何类型的值。通常,printf系列格式字符串中的任何说明符都要求您在此字符串后添加零个或多个特定类型的参数,例如

 printf "%d"
需要一个类型为
int
的参数

%a
说明符要求两个参数,第一个参数是所谓的打印机,第二个参数是打印值本身。打印机是一种类型为
'output\u channel\u type->'a->unit
的功能,该值必须具有
'a
的类型,即它们必须匹配。例如,如果您有一个名为
vec
float
向量,其fortran布局类型为
('el,'elt,Bigarray.fortran_layout)Bigarray.t
,您可以使用
pp_fvec
函数输出它,例如

 Format.printf "vec = %a" pp_fvec vec
我还要澄清一下
'output\u channel\u type
的含义,我把它留作一个类型变量,但它通常是具体的,等于特定函数可以写入的通道类型。例如,
%Printf中的一个
说明符。Printf函数要求您提供一个打印到
输出通道
的函数,该说明符与
格式的说明符相同。Printf
要求一个打印到
格式的输出通道的函数。格式化程序
,通常,此类型必须等于格式化字符串的
格式
类型的第二个类型参数

因此,总而言之,此
pp*
函数族通常用作
%a
函数族格式说明符的打印机。这种类型的打印机还用于打印到toplevel或ocaml调试器中(可以使用
install\u printer
指令安装)。 当然,它可以在独立模式下使用,无需
printf
功能,如下所示:

 open Format
 pp_fvec std_formatter vec
这大致相当于上面的例子


在对后续问题的回答中,所有OCaml库都有一个致命的特性,即已经使用
mli
文件进行了自我记录。向某个库自我介绍的最好方法是使用您最喜欢的编辑器并阅读该库的
mli
文件。随着
ocamlmerlin
ocp index
等现代工具的发展,这将更加容易。你可以直接跳到定义上来。您可以通过
opam config var library\u name:lib
命令找到特定库安装其
mli
文件的位置,其中
library\u name
是库的名称

哇,谢谢你讲得这么详细。我真的很感激。