将数组向左或向右移动 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
的值。
我在 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
的值。