反转数组的功能

时间:2019-08-11 10:17:14

标签: ocaml imperative-programming

tmp是什么意思,代码中的逻辑是什么?

let n = 10;;
let v = Array.create n 0;;
for i=0 to (n-1) do v.(i)<-i done;;

let reverse v =
    let tmp=ref 0
    and n = Array.length(v)
        in for i=0 to (n/2-1) do
            tmp := v.(i);
            v.(i) <- v.(n-i-1);
            v.(n-i-1) <- (!tmp);
done;;


reverse v;;

此外,我没有使用其他语言进行编码的背景。如果您对学习/理解有任何建议和资料,我将非常高兴!

1 个答案:

答案 0 :(得分:1)

您的问题太过广泛了,在Stack Overflow上,明确地没有主题寻求建议和外部资源。但我将简要说明tmp是什么,或者更确切地说ref!:=的作用以及.(i)<-的作用,因为这些是OCaml特定的,因此我认为其余的应该很简单明了。

ref使用给定值初始化“参考单元”。由于在OCaml中,绑定 1 是不可变的,因此,创建名为“变量”的可变变量的方法是创建具有可变字段的记录类型,例如{ mutable contents : int }。 “引用单元格”是类型为'a ref的值,其定义几乎与此完全相同,除了contents的类型为'a而不是int之外,因此可以将其重复用于任何值类型。因此,ref 0会创建类型为int ref的值,然后有效地 就是这样。

!:=是方便操作符,它们对访问ref单元的contents字段进行解糖。具体来说,!tmptmp.contents的贬值和tmp := 1tmp.contents <- 1的贬值。 <-是用于更改记录字段值的运算符。

数组在OCaml中也是可变的,并且还具有方便的语法糖。 v.(i)终止符到Array.get v i,它返回i的第v个元素,而v.(i) <- x终止符到Array.set v i x,它设置{{1 }}第iv的元素。

1 因为没有变化,所以它们被称为“绑定”而不是“变量”