我正在编写一个包含一些循环“for”的ocaml中的程序,我的问题是,对于每个循环,您都会收到以下消息:“警告10:此表达式应该具有类型单位。”
示例:
let f q p rho=
let x = [] in
if q > p then
for i=0 to rho do
x= q :: x
done;
x;;
每次我使用“for”循环时,我该如何解决这个问题?
答案 0 :(得分:8)
您的代码存在一些问题。
错误是因为for
没有返回任何内容,因此循环内部纯粹是为了副作用。所以它应该有单位类型。您对=
的使用没有单位类型,因为=
实际上是等于运算符,比较两个值,并返回true
或false
。
所以你使用了错误的运算符。您似乎正在尝试“分配”给x
。但是在ML中,你不能分配给“变量”,因为它们在定义时被绑定到一个值并且不能改变。获得可变性的一种方法是使用可变单元格(称为“引用”):使用ref
函数从初始值创建可变单元格; !
运算符以获取其值;和:=
运算符来更改内部的值。
例如:
let f q p rho=
let x = ref [] in
if q > p then
for i=0 to rho do
x := q :: !x
done;
!x;;
答案 1 :(得分:3)
这种循环最好用递归表示:
let f q p rho=
let rec loop i =
if i > rho then
[]
else
q::(loop (i+1))
in
if q > p then
loop 0
else
[];;
或者我们可以使它尾递归:
let f q p rho=
let rec loop i acc =
if i > rho then
acc
else
loop (i+1) (q::acc)
in
if q > p then
loop 0 []
else
[];;