OCaml中的a.{X}是什么意思?

6
我目前正在尝试将一些OCaml移植到F#。我对OCaml非常熟悉,但我的F#有些生疏。
无论如何,在OCaml编译器中,该代码构建良好,但是(毫不奇怪)即使打开了ML兼容性,它在F#编译器中仍会出现许多错误。一些错误看起来像保留字,但大部分错误是针对类似以下行中的.{抱怨的:
 m.(a).(b) <- w.{a + b * c};

a,b,c是整数。

我在OCaml网站、Stackoverflow、法语O'Reilly书籍的英文版等地方进行了大量搜索,但找不到类似的内容。当然,大多数搜索工具对标点符号有问题也并没有帮助!是的,我找到了关于 .用于引用记录成员的引用,以及 { }用于定义记录,但二者合在一起呢?从使用方式上,我猜想它是某种关联或稀疏数组?

这个语法是什么意思?最接近的F#等价语法是什么?


探究这些问题的好方法是询问编译器本身,即echo let f x y = x.{y} > zz.ml && ocamlc -i zz.ml && rm zz.ml,它会给出val f : ('a, 'b, 'c) Bigarray.Array1.t -> int -> 'a - ygrek
1个回答

9
这里有 oCaml 文档/手册的 PDF 版本可供使用:

http://caml.inria.fr/distrib/ocaml-3.12/ocaml-3.12-refman.pdf

在第496页(页面底部),有关于通用数组及其get方法的说明:

val get : (’a, ’b, ’c) t -> int array -> ’a

读取通用大数组的一个元素。Genarray.get a [|i1; ...; iN|]返回其坐标在第一维中为i1,第二维中为i2,...,第N维中为iN的元素。

如果a具有C布局,则坐标必须大于或等于0,并严格小于a相应的维度。如果a具有Fortran布局,则坐标必须大于或等于1,并且小于或等于a相应的维度。如果数组a不具有恰好N个维度,或者坐标超出数组边界,则引发Invalid_argument异常。

如果N > 3,则提供备用语法:您可以写a.{i1,i2,...,iN}而不是Genarray.get a [|i1; ...; iN|]。 (使用一、二或三个坐标的语法a.{...}保留用于访问一维、二维和三维数组,如下所述。)

此外,它还指出(特别是关于一维数组):

val get : (’a, ’b, ’c) t -> int -> ’a

Array1.get a x, 或者 a.{x},返回a在索引x处的元素。 x必须大于或等于0,并且对于具有C布局的a来说,严格小于Array1.dim a。如果a具有Fortran布局,则x必须大于或等于1且小于或等于Array1.dim a。否则,会引发Invalid_argument异常。

在F#中,您也可以使用Array.get方法访问数组元素。但是,更接近的语法是w.[a + b * c]。简而言之,在F#中,请使用[]而不是{}


太好了!感谢您的快速回复。我确实看到了关于 [|...|] 符号的参考,不过对于它的同义词我还有疑问 - 但在我的搜索中没有找到任何信息(正如我所说,标点符号很难搜索)。我即将把手册 PDF 下载到我的 iPad 上... - winwaed
1
为了更容易阅读,以下是您所提到的网页版本:http://caml.inria.fr/pub/docs/manual-ocaml/libref/Bigarray.Genarray.html#VALget,另外针对一维 Bigarray,请参考:http://caml.inria.fr/pub/docs/manual-ocaml/libref/Bigarray.Array1.html#VALge(请注意,一维 Bigarray 与常规数组不同)。 - newacct
简而言之,在F#中,使用[]而不是{}。实际上,OCaml对于数组使用w.(i)。BigArrays是一种特殊的数据结构,主要用于与C和其他语言进行交互。 - nlucaroni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接