何时使用管道|>与论点

时间:2018-04-15 16:02:09

标签: ocaml conventions reason

在Reason(和OCaml)中,有一种使用|>运算符传递参数的非传统方法。应该何时使用它的惯例是什么?我目前正在使用它,因为我发现它有多新颖。

2 个答案:

答案 0 :(得分:9)

使用|>(正向管道)有助于显示执行顺序

例如,如果您想执行函数f,那么g就像这样:

g(f(x))

通过这种方式更容易看到执行顺序(例如f然后g):

x |> f |> g

OCamlF#等编程语言经常用于将数据从一种形式转换为另一种形式,因此可以使用|>来表示数据的转换方式。

let sqr = x => x * x;

[1,2,3]
|> List.map (x => x + 1)
|> List.map (sqr);

答案 1 :(得分:3)

反向应用程序运算符(|>)可以简单地定义为

let (|>) x f = f x

此中缀运算符采用值x和函数f,并将后者应用于第一个(f x)。这看起来似乎没什么用,但正确使用时运算符功能强大,因为Ocaml中的函数是curried

例如,假设我们有一个函数wackymath: int -> int -> int -> int

let wackymath a b c = a + b - c

wackymath的类型为int -> int -> int -> int。这是因为在功能领域(特别是lambda演算)中,任何函数一次只适用于一个参数。因此,在括号的帮助下,wackymath的应用顺序如下:

(((wackymath a) b) c)

参数替换可以使这更清楚。

let f1 = wackymath 10;; (* 10 + b - c *)
let f2 = f1 19;;        (* 10 + 19 - c *)  
f2 4;;                  (* 10 + 19 - 4 = 25 *)

这可以用|>运算符表示:

4 |> (19 |> (10 |> wackymath));;

现在很明显为什么它被称为 reverse 应用程序运算符。括号在那里因为|>是左关联的。说|>有助于避免括号在所有情况下都不完全准确。

通常,当您想要编写一系列顺序函数应用程序时,运算符非常有用

[1; 2; 3; 4; 5]
|> List.map (fun x -> x * 2)
|> List.filter (fun x -> x < 3)
|> fun l -> match l with
   | [] -> 0
   | l' -> l' |> List.fold_left ~init:0 ~f:(fun a b -> a + b)
;;