2015-12-05 45 views
3

我是ocaml的新手,通过了一些教程,并认为对于下一步,我会通过阅读一些OOS来熟悉语法。所以我从facebook上下载了Flow运营商'|>'在Facebook的流程

但是,我遇到了一些奇怪的使用'|>'的语法,我无法弄清楚。

首先,我所遇到的“|>” here

args = CommandSpec.ArgSpec.(
    empty 
    |> flag "--tokens" no_arg 
     ~doc:"Include a list of syntax tokens in the output" 
    |> flag "--pretty" no_arg 
     ~doc:"Pretty-print JSON output" 
    |> CommandUtils.from_flag 
    |> anon "file" (optional string) ~doc:"[FILE]" 
) 

当我在寻找它的定义,我发现这在另一个文件:

let (|>) (o : 'a) (f : 'a -> 'b) : 'b = f o 

但我不太清楚它在做什么或者甚至是相关的。

你能帮忙吗?

回答

5
let (|>) (o : 'a) (f : 'a -> 'b) : 'b = f o 

这是声明了一个管道符称为|>,你知道是因为周围的名字括号的中缀。

它有两个参数,o具有未知类型'a,和f它是从'a到第二未知类型'b的功能。

|>返回某种类型'b

结果由f o计算。

换句话说,o |> ff o相同。这只是一个肮脏/整洁的技巧,能够以这种方式在链中编写参数声明,而不必在所有内容中都放置很多括号。运算符的优先级低,因此它在每个标志声明之间起到分隔符的作用。

+1

'你知道这是内联':是否与其他语言的'中缀'相同? – Laurent

+2

正确的词是中缀,答案应该是固定的。 – Drup

+2

固定,谢谢你们。 –

3

这是一个(向前)管道操作员。

而不是调用函数它的形式:

f arg 

管道运营商允许你调用它为:

arg |> f 

这使得链接函数调用显著更易于读取和写入。

arg |> f |> g |> h 

VS

h (g (f arg)) 
1

它是管操作者 它允许应用的功能的序列很容易: F(克(HX))可以写成X |> H |>克| > f。

它的声明使用圆括号表示它是一个中缀运算符: x |> f表示f x。