在Reason(和OCaml)中,有一种使用|>
运算符传递参数的非传统方法。应该何时使用它的惯例是什么?我目前正在使用它,因为我发现它有多新颖。
答案 0 :(得分:9)
使用|>
(正向管道)有助于显示执行顺序。
例如,如果您想执行函数f
,那么g
就像这样:
g(f(x))
通过这种方式更容易看到执行顺序(例如f
然后g
):
x |> f |> g
OCaml
或F#
等编程语言经常用于将数据从一种形式转换为另一种形式,因此可以使用|>
来表示数据的转换方式。
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)
;;