# 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
的一个引用。
答案 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 ...
的更明确的方式。