Ocaml 警告10:此表达式的类型应为unit
我正在用ocaml编写一个程序,其中包含一些循环“for”,我的问题是,对于这些循环中的每一个,您都会收到这样一条消息:“警告10:这个表达式应该有类型unit。” 例如:Ocaml 警告10:此表达式的类型应为unit,ocaml,Ocaml,我正在用ocaml编写一个程序,其中包含一些循环“for”,我的问题是,对于这些循环中的每一个,您都会收到这样一条消息:“警告10:这个表达式应该有类型unit。” 例如: let f q p rho= let x = [] in if q > p then for i=0 to rho do x= q :: x done; x;; 每当我使用循环“for”时,
let f q p rho=
let x = [] in
if q > p then
for i=0 to rho do
x= q :: x
done;
x;;
每当我使用循环“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;;
这种循环最好使用递归来表示:
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
[];;
谢谢你的回答,通过你的例子加上“!”:x:=q:!x