与 lacaml 类型签名混淆
Confusion with lacaml type 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 文档的最佳方式是什么?对于大多数库来说,教程、评论和解释充其量似乎真的很少。我不想一直问这些问题,但是关于其中很多问题的文档真的很糟糕。
感谢您的帮助!
格式字符串中有一个 %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
的含义,我将其保留为类型变量,但通常它是具体的,等于特定函数可以写入的通道类型。例如,Printf.printf
函数中的 %a
说明符要求您提供一个打印到 out_channel
的函数,Format.printf
的相同说明符要求提供一个打印到输出通道的函数类型 Format.formatter
等。通常此类型必须等于格式化字符串的 format
类型的第二个类型参数。
因此,总而言之,这个 pp*
函数族通常用作 Format 函数族的 %a
格式说明符的打印机。这种类型的打印机也用于打印到顶层或 ocaml 调试器(并且可以使用 install_printer
指令安装)。
当然也可以单独使用,不用printf
功能,像这样:
open Format
pp_fvec std_formatter vec
大致相当于上面的例子。
在后续问题的回答中,所有 OCaml 库都有一个致命的特性,即已经使用 mli
文件进行了自我记录。向某个库介绍自己的最佳方式是使用您最喜欢的编辑器并阅读该库的 mli
个文件。随着 ocamlmerlin
和 ocp-index
等现代工具的发展,这要容易得多。你可以跳到定义。您可以通过 opam config var library_name:lib
命令找到特定库安装其 mli
文件的位置,其中 library_name
是库的名称。
我目前正在查看此文档并尝试确定 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 文档的最佳方式是什么?对于大多数库来说,教程、评论和解释充其量似乎真的很少。我不想一直问这些问题,但是关于其中很多问题的文档真的很糟糕。
感谢您的帮助!
格式字符串中有一个 %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
的含义,我将其保留为类型变量,但通常它是具体的,等于特定函数可以写入的通道类型。例如,Printf.printf
函数中的 %a
说明符要求您提供一个打印到 out_channel
的函数,Format.printf
的相同说明符要求提供一个打印到输出通道的函数类型 Format.formatter
等。通常此类型必须等于格式化字符串的 format
类型的第二个类型参数。
因此,总而言之,这个 pp*
函数族通常用作 Format 函数族的 %a
格式说明符的打印机。这种类型的打印机也用于打印到顶层或 ocaml 调试器(并且可以使用 install_printer
指令安装)。
当然也可以单独使用,不用printf
功能,像这样:
open Format
pp_fvec std_formatter vec
大致相当于上面的例子。
在后续问题的回答中,所有 OCaml 库都有一个致命的特性,即已经使用 mli
文件进行了自我记录。向某个库介绍自己的最佳方式是使用您最喜欢的编辑器并阅读该库的 mli
个文件。随着 ocamlmerlin
和 ocp-index
等现代工具的发展,这要容易得多。你可以跳到定义。您可以通过 opam config var library_name:lib
命令找到特定库安装其 mli
文件的位置,其中 library_name
是库的名称。