【问题标题】:Trouble understanding the output of this OCaml code无法理解此 OCaml 代码的输出
【发布时间】:2014-03-19 10:59:00
【问题描述】:
# 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 

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

【问题讨论】:

  • 对 ref 递增代码的一个提示:有 Pervasives.incr 可以做到这一点,因此第 4 行可以重写为 incr c (好吧,gsg 说过... )

标签: reference ocaml ref


【解决方案1】:

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

counter 的类型是unit -&gt; unit -&gt; int,这意味着counter () 返回一个unit -&gt; int 类型的函数。如果我们说let incCounter = counter (),我们将获得一个新创建的unit -&gt; int 类型的函数。反过来,此函数会修改之前通过调用 counter () 构造的引用。

也就是说,counter () 的目的是构造一个新的计数器,之后可以递增。

【讨论】:

    【解决方案2】:

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

    顺便说一句,incr c 是表达let _ = c := c + 1 in ... 的更清晰的方式。

    【讨论】:

      猜你喜欢
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 2020-10-21
      • 1970-01-01
      • 2014-09-19
      • 2017-11-13
      • 1970-01-01
      相关资源
      最近更新 更多