OCaml 的 set_signal 在 F# 中的等价物

OCaml's set_signal's equivalent in F#

我搜索了一下,没有找到任何东西。我 "translating" 是 F# 的 OCaml chess program ,既可以作为一种工具来理解国际象棋表示的工作方式,也可以说是内化 F# 的非 OO 处理方式。

这些代码让我很困惑

set_signal sigint (Signal_handle (fun _ -> raise Interrupt));

set_signal sigint Signal_ignore;

中断是之前定义的异常。现在我查看了 set_signal 的作用 (here),但我无法弄清楚它的目的到底是什么,或者根本无法弄清楚 sigint 是如何定义的。我如何在 F# 中复制或模仿这种行为。

如果您想在上下文中查看它,它位于 OCaml 源代码的第 532 行附近。这是有问题的方法:

let alpha_beta_deepening pos interval = 
    del_timer ();
    let current_best = ref (alpha_beta_search pos 2) in (* alpha_beta_seach _ 2   can only return legal moves *)
    ((try 
        set_signal sigint (Signal_handle (fun _ -> raise Interrupt));
        set_timer interval;
        let rec loop i = 
            if i > max_depth then () else
            let tmp = alpha_beta_search pos i in
            current_best := tmp;
            if (fst tmp) >=  win (* we can checkmate *)
            || (fst tmp) <= -win (* we get checkmated anyway, deny the opponent extra time to think *)
                then () else loop (i+1) 
        in loop 3;
        set_signal sigint Signal_ignore;
        del_timer ();
    with Interrupt -> ());
    set_signal sigint Signal_ignore;
    del_timer ();
    !current_best)

这就是命名空间的坏处,很难知道它们从何而来。

因此,首先,sigintSys 模块中定义:

val sigint : int

  Interactive interrupt (ctrl-C)

所以,

 set_signal sigint (Signal_handle (fun _ -> raise Interrupt));

 set_signal sigint Signal_ignore;

做吗?

他们只是告诉系统(set_signal 向系统传达他在特定信号上应该有什么行为)当它捕捉到 ctrl-C 时,在第一种情况下它会引发 Interrupt 在第二种情况下它什么都不做。

既然您已经更好地理解了它的含义,我认为在 F# 中实现它很容易,不是吗? ;-)

例如,您可以查看 this(同时查看 OCaml 和 F# 代码)