警告10:此表达式应具有类型单位

时间:2010-11-30 10:48:19

标签: ocaml

我正在编写一个包含一些循环“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”循环时,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

您的代码存在一些问题。

错误是因为for没有返回任何内容,因此循环内部纯粹是为了副作用。所以它应该有单位类型。您对=的使用没有单位类型,因为=实际上是等于运算符,比较两个值,并返回truefalse

所以你使用了错误的运算符。您似乎正在尝试“分配”给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
      [];;