2015-05-27 5 views
10

Может ли кто-нибудь объяснить, что делает оператор |>? Этот код был взят из ссылки here:OCaml |> operator

let m = PairsMap.(empty |> add (0,1) "hello" |> add (1,0) "world") 

Я могу видеть, что он делает, но я не знаю, как применить | оператор> в противном случае.

В этом отношении я понятия не имею, что делает синтаксис Module.(). Объяснение этому тоже было бы неплохо.

ответ

15

Module.(e) эквивалентен let open Module in e. Это сокращенный синтаксис для введения вещей в сферу действия.

Оператор |> определен в модуле Pervasives как let (|>) x f = f x. (Фактически, он определяется как внешний примитив, проще компилировать. Здесь это неважно). Это функция обратного приложения , что упрощает цепочку последовательных вызовов. Без этого вам нужно будет написать

let m = PairsMap.(add (1,0) "world" (add (0,1) "hello" empty)) 

, которому требуется больше скобок.

3

Оператор |> представляет собой приложение обратной функции. Это звучит сложно, но это просто означает, что вы можете поместить функцию (и, возможно, несколько дополнительных параметров) после значение, к которому вы хотите применить. Это позволяет создать что-то, что выглядит как трубопровод Unix:

# let (|>) x f = f x;; 
val (|>) : 'a -> ('a -> 'b) -> 'b = <fun> 
# 0.0 |> sin |> exp;; 
- : float = 1. 

Обозначение Module.(expr) используется для открытия модуля временно для одного выражения. Другими словами, вы можете использовать имена из модуля непосредственно в выражении без необходимости префикса имени модуля.

3

Оператор |> выглядит как | в bash.

Основная идея заключается в том, что

e |> f = f e 

Это способ писать приложения в порядке исполнения.

Как Exemple вы могли бы использовать его (я не особо думаю, вы должны хотя), чтобы избежать позволяет:

12 |> fun x -> e 

вместо

let x = 12 in e 

Для Module.() вещи, он должен использовать определенную функцию данного модуля.

Возможно, вы, вероятно, видели List.map. Вы можете, конечно, использовать open List, а затем обращаться к функции только с помощью map. Но если вы также open Array, то map теперь относится к Array.map, поэтому вам нужно использовать List.map.

Смежные вопросы