OCaml无法获取数组长度

时间:2019-07-19 04:53:07

标签: ocaml

我是OCaml的新手,现在正尝试移动数组。 但是我在arr.length上收到语法错误。 (第二行)

let shift (arr : array) (k : int) =
    let size = arr.length;;
    let shifted = Array.make size 0;;

    for i = 0 to size- 1 do
        if i < k
        then shifted.(size- 1 - k + i) <- arr.(i);;
        else shifted.(i-k) <- arr.(i);;
    done

    shifted;;

1 个答案:

答案 0 :(得分:5)

已更新

您的代码有一些问题。

首先,;;符号实际上不是OCaml语法的一部分。仅在解释器(顶层或REPL)中使用它来告诉解释器何时评估您到目前为止输入的内容。在普通的源代码中,它很少使用。许多人(包括我在内)都采用一种在源文件中从未使用过;;的样式。

相比之下,您几乎在每一行都以;;结尾,这肯定会导致语法错误。

定义函数局部变量的方式如下:

let var = expr in
(* rest of function comes here *)

所以你应该拥有

let size = Array.length arr in
let shifted = Array.make size 0 in
. . .

您应该删除所有;;令牌,并根据需要添加in

此外,您正在使用一种面向对象的语法。但是数组不是OO风格的对象。要获取名为arr的数组的长度:

Array.length arr

外观如下:

# let arr = Array.make 10 0;;
val arr : int array = [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]
# Array.length arr;;
- : int = 10
# Array.length [| "another"; "example" |];;
- : int = 2

换句话说,lengthArray模块中定义的功能。 OCaml数组不是(OO类的)对象,并且没有方法。

(供以后参考,使用#来引用OCaml对象的方法,就像object#method中一样。)