Ocaml 警告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”时,

我正在用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”时,如何解决这个问题?

您的代码有几个问题

错误是因为的
没有返回任何内容,因此循环的内部完全是为了产生副作用。所以它应该有单位类型。您使用的
=
没有单位类型,因为
=
实际上是相等运算符,用于比较两个值,并返回
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