Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml 如何在模块中定义静态变量?_Ocaml - Fatal编程技术网

Ocaml 如何在模块中定义静态变量?

Ocaml 如何在模块中定义静态变量?,ocaml,Ocaml,因此,基本上我试图在模块中定义一个静态(全局)变量 在OCaml中编程时,我经常使用class。现在,当我尝试使用模块系统时,我发现我不知道如何在OCaml中定义静态(全局)变量。。我真丢脸 以下是一个例子: module Util = struct let l = ref [] let get_l = !l let set_l x = l := x::!l end open Util let () = let () = set_l 1 in

因此,基本上我试图在
模块中定义一个静态(全局)变量

OCaml
中编程时,我经常使用
class
。现在,当我尝试使用
模块
系统时,我发现我不知道如何在
OCaml
中定义静态(全局)变量。。我真丢脸

以下是一个例子:

module Util = struct

  let l = ref [] 

  let get_l = 
      !l
  let set_l x =
     l := x::!l

end

open Util 

let () =
  let () = set_l 1 in
  let () = set_l 2 in
  print_int (List.length get_l)
总之,重新调用函数
set\u l
将创建
l
的新实例,这不是我需要的

谁能给我一些关于在
模块
中定义
静态
变量的指导

IMHO,重新调用函数集将创建一个新的l实例,这不是我需要的

你的直觉是错误的

l := x :: !l
x
前置到当前值
l
,并将新创建的值分配到
l
,该值实际上是一个指针

不会创建新实例

代码中的问题在于
get\l
。将在定义后立即对其进行评估。例如,在时间点,当
l
仍然为空时。这意味着您需要将解引用延迟到真正需要该值的时间点。因此,您真正想要的是:

let get_l () = 
  !l


现在,
get_l()
只有在您完成这两个任务后才会取消引用
l
引用。

@computereasy这不是ocaml的错误!在一种情况下,
get\u l
仅仅是一个值(在定义它时计算),是不可变的,因此它不应该给您一个更新的
l
。@ivg版本使用的函数可以查找
l
所指的当前值。
let () =
  let () = set_l 1 in
  let () = set_l 2 in
  print_int (List.length (get_l ()))