无法理解此OCaml代码的输出

时间:2014-02-19 08:34:34

标签: reference ocaml ref

# let counter () = 
    let c = ref 0 in 
    fun () -> 
      let _ = c := !c + 1 in 
      !c ;; 
val counter : unit -> unit -> int = <fun> 

# let incCounter = counter () ;; 

# incCounter () ;; 
- : int = 1 

# incCounter () ;; 
- : int = 2 

我不明白为什么每次拨打let c = ref 0时都不会再次调用incCounter () ;;行。每次调用fun() ->...时,c部分似乎只适用于incCounter的一个引用。

2 个答案:

答案 0 :(得分:4)

每次调用let c = ref 0时都会调用counter行(而不是每次调用incCounter时)。

counter的类型为unit -> unit -> int,表示counter ()返回类型为unit -> int的函数。如果我们说let incCounter = counter (),我们会获得一个新创建的unit -> int类型的函数。反过来,该函数修改之前由调用counter ()构建的引用。

尽管如此,counter ()的目的是构建一个新的计数器,然后可以递增。

答案 1 :(得分:0)

这是对的。每次调用特定函数值时,都将访问相同的参考单元格。如果再次调用counter,您将获得访问不同参考单元格的不同函数值。

顺便提一下,incr c是表达let _ = c := c + 1 in ...的更明确的方式。