我是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;;
答案 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
换句话说,length
是Array
模块中定义的功能。 OCaml数组不是(OO类的)对象,并且没有方法。
(供以后参考,使用#
来引用OCaml对象的方法,就像object#method
中一样。)