代码之家  ›  专栏  ›  技术社区  ›  Mat Kelly

在OCaml中操作列表

  •  2
  • Mat Kelly  · 技术社区  · 17 年前

    在下面的上下文中,我在操作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(createListofements 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 回复  |  直到 17 年前
        1
  •  1
  •   nlucaroni    17 年前

    必须使用引用来中断持久性,因为函数式编程使用持久性数据。使用 ref myList声明中的关键字:

    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
    

    编辑:

    我没有编译代码,也没有注意到您使用了错误的符号来更改引用的值。正确的符号是, := . 请看上面我的找零。不过,我强烈建议你避开推荐信,走累加器路线。

    推荐文章