Оператор OCaml |>

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

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

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

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

Ответ 1

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))

который требует больше скобок.

Ответ 2

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

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

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

12 |> fun x -> e

вместо

let x = 12 in e

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

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