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;;
此外,我没有使用其他语言进行编码的背景。如果您对学习/理解有任何建议和资料,我将非常高兴!
答案 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
字段进行解糖。具体来说,!tmp
对tmp.contents
的贬值和tmp := 1
对tmp.contents <- 1
的贬值。 <-
是用于更改记录字段值的运算符。
数组在OCaml中也是可变的,并且还具有方便的语法糖。 v.(i)
终止符到Array.get v i
,它返回i
的第v
个元素,而v.(i) <- x
终止符到Array.set v i x
,它设置{{1 }}第i
至v
的元素。
1 因为没有变化,所以它们被称为“绑定”而不是“变量”