操作OCaml中的列表

时间:2009-03-11 15:18:26

标签: functional-programming list ocaml variable-assignment

我遇到了在下面的上下文中操作OCaml中深层嵌套列表的问题。

class foo (pIn:int)=
object (self)
    val p = pIn
    val even = if (pIn mod 2) = 0 then true else (false)
    method doIt = "doIt"
    method isEven = even
    method getP = p
end;;

let rec createListOfElements howMany =  (
    Random.self_init ();
    if howMany > 1 then ((new foo (Random.int 10))::(createListOfElements (howMany - 1)))
    else ([(new foo (Random.int 10))])  );;

let myList = createListOfElements 5;;

let rec process1 param =
     if param <= 10 then
          let f = new foo param in          (
                if f#isEven then (myList <- List.append myList (createListOfElements f#getP));
                Printf.printf "%s\n" f#doIt;
                process1 (param+1)                                  )
in process1 0;;

我得到的错误是“未绑定的实例变量myList”。如何在此上下文中将“List.append myList(createListOfElements f#getP)”的结果分配给myList?

谢谢!


编辑功能:

let myList = ref (createListOfElements 5);;

let rec process1 param =
     if param <= 10 then
          let f = new foo param in          (
                if f#isEven then (myList <- !myList @ (createListOfElements f#getP));
                Printf.printf "%s\n" f#doIt;
                process1 (param+1)                                  )
in process1 0;;

1 个答案:

答案 0 :(得分:1)

您必须使用引用来中断持久性 - 因为函数式编程使用持久性数据。在myList:

的声明中使用ref关键字
let myList = ref (createListOfElements 5)

要取消引用列表,请使用!,以便相关的行变为

if f#isEven then
  myList := !myList @ f#getP;

我建议您使用累加器,因为它符合函数式编程风格,如下所示:

let rec process1 lst = function
  | x when x <= 10 ->
      let f = new foo x in
      if f#isEven then
          process1 (lst @ (createListOfElements f#getP)) (param+1)
      else
          process1 lst (param+1)
  | _ -> lst

修改

我没有编译我的代码,也没有注意到您使用了错误的符号来更改引用的值。正确的符号是:=。看看我上面的变化。我强烈建议你避免引用,然后去累加器路径。