是否有OCaml'@@'运算符,这是什么意思?

时间:2015-10-28 15:07:08

标签: ocaml

我是OCaml n00b并尝试理解以下源文件:

https://github.com/BinaryAnalysisPlatform/bap/blob/master/lib/bap_disasm/bap_disasm_shingled.ml

在第46行,有以下代码:

let static_successors gmin gmax lmem insn =
  let fall_through =
    if not (is_exec_ok gmin gmax lmem) then [None, `Fall]
    else
      let i = Word.((Memory.min_addr lmem) ++ (Memory.length lmem)) in      
      [Some i, `Fall] in
  if (Insn.may_affect_control_flow insn) then (
    let targets = (Insn.bil insn |> dests_of_bil) in
    if (not @@ Insn.is_unconditional_jump insn) then
      List.append fall_through targets
    else
      targets
  ) else fall_through

我得到了大部分功能的要点,但是if (not @@ Insn.is_unconditional_jump insn部分让我很难受。我似乎找不到@@运算符/函数的引用;它似乎以某种方式将函数应用于实例insn

那么,@@是一个内置运算符,如果是这样,它会做什么?如果没有,我如何找到操作员/功能的声明,所以我可以找到它并找出来?

1 个答案:

答案 0 :(得分:5)

此操作符是在4.01中的Pervasives("始终打开"模块)中引入的。

基本上,它是('a -> 'b) -> 'a -> 'b类型。因此f @@ x相当于f x

好处是它的相关性和优先性。

在这种特定情况下,not @@ Insn.is_unconditional_jump insnnot (Insn.is_unconditional_jump insn)完全相同。

它被声明为内部基元,因此对你没有多大帮助,但你可以在OCaml manual中看到有关它的信息。