组合运算符

两个有用的高阶函数是二进制应用程序@@)和反向应用程序管道|>)运算符。虽然从 4.01 开始它们可以作为基元使用,但在这里定义它们仍然是有益的:

let (|>) x f = f x
let (@@) f x = f x

考虑增加 3 的平方的问题。表达该计算的一种方法是:

(* 1 -- Using parentheses *)
succ (square 3)
(* - : int = 10 *)

(* where `square` is defined as: *)
let square x = x * x

请注意,我们不能简单地做 succ square 3 因为(由于左关联性 )会减少到毫无意义的 (succ square) 3。使用应用程序(@@)我们可以表示没有括号:

(* 2 -- Using the application operator *)
succ @@ square 3
(* - : int = 10 *)

注意最后一个要执行的操作(即 succ)是如何在表达式中首先出现的?该反应用运算符(|>)允许我们,唉,反转这个:

(* 3 -- Using the reverse-application operator *)
3 |> square |> succ
(* - : int = 10 *)

数字 3 现在通过 square 然后 succ管道,而不是应用于 square 以产生应用 succ 的结果。