在 Ocaml 中找到 **,但不是为了求幂

Found ** in Ocaml, but not for exponentiation

在一本关于逻辑的书(https://www.cl.cam.ac.uk/~jrh13/atp/OCaml/real.ml)中,我找到了这样的代码:

let integer_qelim =
   simplify ** evalc **
   lift_qelim linform (cnnf posineq ** evalc) cooper;;

我以前见过 **,但它是用于求幂的,而在这里我不认为它用于此,因为数据类型不是数字。我会说它是函数组合器之王,但不知道。

我认为这本书是为 3.06 版本编写的,但是 4 (https://github.com/newca12/ocaml-atp) 的更新代码维护了这一点,所以 ** 仍然以我不理解的方式使用。

在 OCaml 中,您可以将任何行为绑定到运算符,例如,

let ( ** ) x y = print_endline x; print_endline y

这样 "hello" ** "world" 就会打印

hello
world

在您引用的代码中,(**) 运算符绑定到函数组合:

let ( ** ) = fun f g x -> f(g x)

这是 lib.ml 中定义的效用函数:

let ( ** ) = fun f g x -> f(g x);;

它是一个组合运算符,在其他示例中通常称为 compose

你可以这样使用它:

let a x = x^"a" in
let b x = x^"b" in
let c x = x^"c" in
let foo = a ** b ** c in
foo "input-";;
- : string = "input-cba"

你可以写成

let foo x = a (b (c x))

let foo x = a @@ b @@ c x

let foo x = c x |> b |> a

还有。