我遇到了在下面的上下文中操作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;;
答案 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
修改强>
我没有编译我的代码,也没有注意到您使用了错误的符号来更改引用的值。正确的符号是:=
。看看我上面的变化。我强烈建议你避免引用,然后去累加器路径。