定义一个基于引用返回另一个函数的函数

Defining a function returning another function based on a reference

下面的代码没有像我想象的那样工作:

let debug_flag = ref false

let dprintf = let open Printf in
  match !debug_flag with
  | true -> printf
  | false -> ifprintf stdout

let test_dprintf () =
  begin
    debug_flag := true;
    Printf.printf "print1\n";
    dprintf "print2\n";
    Printf.printf "print3\n";
    debug_flag := false
  end

我希望它能输出

print1
print2
print3

然而它只打印

print1
print3

test_dprintf中将true分配给debug_flag似乎根本没有任何影响。

有谁知道为什么?如果是这样,您是否知道可能的解决方法?

我正在使用 OCaml 4.09.0

感谢您的回答

dprintf的定义不是函数表达式。它是一个将 return 函数的表达式,但仅在计算 dprintf 的定义时才计算表达式本身,而不是在调用它 returns 的函数时计算。

要解决这个问题,您可以将参数显式化:

let dprintf fmt = let open Printf in
  match !debug_flag with
  | true -> printf fmt
  | false -> ifprintf stdout fmt

现在 dprintf 的主体将在调用时进行计算。