我目前正在尝试将一些OCaml移植到F#。我与OCaml“陷入了困境”,我的F#有点生疏。
无论如何,OCaml代码在OCaml编译器中构建得很好,但是(毫不奇怪)即使在ML兼容性开启的情况下也会在F#编译器中产生大量错误。有些错误看起来是保留字,但大部分错误都在抱怨.{
行,例如:
m.(a).(b) <- w.{a + b * c};
a,b,c是整数。
我已经通过OCaml网站,Stackoverflow,法国O'Reilly书籍的英文翻译等进行了大量搜索,但却找不到这样的内容。当然,大多数搜索工具都会出现标点字符问题,这无济于事!是的我发现引用.
被用来引用记录成员,而{ }
被用来定义记录,但两者都在一起?根据用法,我假设它是某种关联或稀疏数组?
这种语法是什么意思?什么是最接近的F#等价物?
答案 0 :(得分:9)
这里有oCaml文档/手册的pdf:
http://caml.inria.fr/distrib/ocaml-3.12/ocaml-3.12-refman.pdf
在页496(在页面底部),它说的是通用数组及其get方法:
val get:('a,'b,'c)t - &gt; int数组 - &gt; “一
读取通用大数组的元素。 Genarray.get a [| i1; ...; iN |]返回 a的元素,其坐标在第一维中为i1,在第二维中为i2 尺寸, 。 。 。,iN在第N维。
如果a具有C布局,则坐标必须大于或等于0且严格小于 a的相应尺寸。如果a具有Fortran布局,则坐标必须为 大于或等于1且小于或等于a的相应尺寸。提高 如果数组a没有完全N维,或者如果是,则为Invalid_argument 坐标位于数组范围之外。
如果N&gt; 3,提供了替代语法:你可以写一个。{i1,i2,...,iN}代替 Genarray.get a [| i1; ...;在|]。 (语法a。{...}有一个,两个或三个 坐标保留用于访问一维,二维和三维数组 如下所述。)
此外,它说(特别是关于一维数组):
val get:('a,'b,'c)t - &gt; int - &gt; “一
Array1.get a x,或者a。{x},返回at索引x的元素。 x必须 大于或等于0且严格小于Array1.dim a如果a具有C布局。如果一个 具有Fortran布局,x必须大于或等于1且小于或等于 Array1.dim a。否则,将引发Invalid_argument。
在F#中,您也可以使用Array.get
方法访问数组元素。但是,更接近的语法是w.[a + b * c]
。简而言之,在F#中,使用[]
代替{}
。