gpt4 book ai didi

ocaml - 这个 OCaml 代码是如何工作的?

转载 作者:行者123 更新时间:2023-12-01 22:32:20 25 4
gpt4 key购买 nike

以下 OCaml 代码创建了一个通用类型(不是我的,来自 Jane Street's website ):

module Univ : sig
type t
val embed: unit -> ('a -> t) * (t -> 'a option)
end = struct
type t = bool -> unit
let embed () =
let r = ref None in
let put x =
let sx = Some x in
fun b -> r := if b then sx else None
in
let get f =
f true;
let res = !r in
f false; res
in
put, get
end

创建通用类型。在其中,对 embed () 的调用创建了一个二元组函数。元组中的第一个函数在封闭的引用单元中存储一个任意值;第二个函数检索它。如果将类型 t 的错误值提供给第二个函数,则它会返回 None。但是,在我看来,这会导致清除引用单元格,从而进一步尝试检索失败的值,但这并没有发生。此外,我一般不了解将错误值传递给投影函数 get 时会发生什么情况。

最佳答案

embed 被调用时,一个新的引用 r 和函数 putget 的两个新闭包被分配。当某些 put 被调用时,它会返回一个新的函数(我们称它为 setter),它的闭包中也有 r

  • 如果该 setter 被赋予相应的 get,则在两个闭包中捕获的 r 是相同的,因此当 get调用 f true,它修改 get 闭包中的 r,并且 let res = !r 读取一个 一些值。

    let get f =
    f true; (* assign the shared reference r *)
    let res = !r in (* read r *)
    f false; (* clear r *)
    res
  • 如果setter被赋予了一个不对应的get,则get捕获的r和setter不是相同的。 (我们称它们为 r1r2)

    let get f =
    f true; (* assign r1 *)
    let res = !r in (* read r2 *)
    f false; (* clear r1 *)
    res

    由于 get 负责始终清除 r,我们知道在调用之前getr2None。因此 get 将返回 None

关于ocaml - 这个 OCaml 代码是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29036841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com