在 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
还有。
在一本关于逻辑的书(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
还有。