将数组向左或向右移动 OCaml

Shifting array to left or right OCaml

我在 OCaml 中的数组方面遇到了一些问题。 也就是说,我只想根据传递的值将元素向右或向左移动。 示例:# let a = [|1;2;3;4;5|], # shift_array a 7;;- : int array array = [|4;5;1;2;3|]

我写了下面的代码,但在形成第二个数组的地方总是出现语法错误。

let shift_array arr x =
  let size = Array.length arr in
  let sec_arr = Array.make size 0 in
  for i = 0 to size - 1 do
    if i < x
    then (sec_arr.(size - x + 1) <- arr.(i))
    else (sec_arr.(i-x) <- arr.(i))
  done;;

我不是 100% 确定如何打印出新数组。

编辑:通过在第二行和第三行添加 in 来修复它。

现在的问题是该函数的类型为 int array -> int -> unit,而我要获取的类型是 'a array -> int -> 'a array。有什么办法可以解决这个问题吗?

它应该是 let size = Array.length arr in,请注意您遗漏的 in

OCaml 中的 let 表达式具有 let <var> = <expr> in <body> 的形式,不应(但通常是)与只能出现的 let definition 混淆在顶层(作为模块的一个元素),其形式为 let <name> = <body>.

在您的示例中,您同时拥有顶级定义 let shift_array = <body> 和两个 let 表达式(但是,您对它们使用了错误的语法。

编辑:

由于 OP 编辑​​了 post,这里是相应的编辑。

你的函数没有 return 任何东西,它创建一个新数组,执行循环,但 return 除了 unit 值(这是值for 循环计算的结果)。因此,您必须再添加一行,其中包含表达式,整个函数将对其求值。提示排序运算符 ; 是你需要的,当你有表达式 x;y;z 时,计算机计算 x,然后计算 y,最后计算 z 和值x;y;z 的整个表达式是 z 的值。