在OCaml中执行的过程

在OCaml中执行的过程,ocaml,Ocaml,我有以下代码: let p = print_string("finished\n");; let x0 = ref 0;; class point = object val mutable x = incr x0; !x0 method get_x = x method move d = x <- x + d end ;; print_int(new point#get_x);; p;; print_int(new point#get_x);; p;;

我有以下代码:

let p = print_string("finished\n");;

let x0 = ref 0;;

class point =
  object
    val mutable x = incr x0; !x0
    method get_x = x
    method move d = x <- x + d
  end
;;

print_int(new point#get_x);;
p;;
print_int(new point#get_x);;
p;;
我的期望实际上是:

1
finished
2
finished

任何人都可以知道执行这段代码的正确顺序是什么?

主要的混淆点是您的
p
不是一个函数。这只是一个价值。特别是,它是值
()
(称为单位)。因此,当您稍后在代码中评估
p
时,它没有效果。所有的工作都是在创建p时完成的

如果您想让p像一个函数一样工作(这似乎是您想要的),您应该这样定义它:

let p () = print_string "finished\n";;
p ();;
你应该这样称呼它:

let p () = print_string "finished\n";;
p ();;

主要的混淆点是你的
p
不是一个函数。这只是一个价值。特别是,它是值
()
(称为单位)。因此,当您稍后在代码中评估
p
时,它没有效果。所有的工作都是在创建p时完成的

如果您想让p像一个函数一样工作(这似乎是您想要的),您应该这样定义它:

let p () = print_string "finished\n";;
p ();;
你应该这样称呼它:

let p () = print_string "finished\n";;
p ();;